如何在 php 中获得带有 preg_replace 扩展名的干净字符串?

How to get a clean string with extension with preg_replace in php?

我想转换这个字符串

$text = "TEST#%_'JanE,.-_doc30)/||\.pdf$@!3)";

像这样变成干净的字符串

TEST_JanE_doc30.pdf

所以,基本上 preg_replace 应该是:

这可能吗?这是我目前的 preg_replace:

$text          = "TEST#%_'JanE,.-_doc30)/||\.pdf$@!3)";
$text_filter_1 = preg_replace('/[^.\d\w\.]+/', '_', $text);
$text_filter_2 = preg_replace('/\./', '_', $text_filter_1);

这是一个工作脚本,它使用多个正则表达式替换来完成工作。最关键的逻辑是按以下模式拆分的初始正则表达式:

(?=\.\w+)(?!.*\..*\.)

这表示要在最后一个点上拆分,假定它是文件的扩展名。它给我们留下了以下两个组成部分:

Array
(
    [0] => TEST#%_'JanE,.-_doc30)/||\
    [1] => .pdf$@!3)
)

脚本的其余部分通过将所有非单词字符组替换为单个下划线占位符来处理文件名。然后,另一个正则表达式通过剥离 .pdf.

之后的所有内容来检索文件的扩展名
$text = "TEST#%_'JanE,.-_doc30)/||\.pdf$@!3)";
$parts = preg_split ("/(?=\.\w+)(?!.*\..*\.)/", $text); 
$filename = preg_replace('/[^A-Za-z0-9]+/', '_', $parts[0]);
$filename = preg_replace('/_$/', '', $filename);
$ext = preg_replace('/^(\.[A-Za-z0-9]+).*$/', '', $parts[1]);
print_r($parts);
$file = $filename . $ext;
echo $file;

TEST_JanE_doc30.pdf

您可以使用 3 阶段替换来完成此操作。请注意,我假设文件扩展名是紧跟在最后一个句点之后的字母数字字符,任何其他字符(例如测试数据中的 3)都将被丢弃。

$text = "TEST#%_'JanE,.-_doc30)/||\.pdf$@!3)";
$text = preg_replace(array('/[^\dA-Za-z]+(?=.*\.[^.]+$)/',
                           '/_\./', 
                           '/(\.[\dA-Za-z]+).*$/'),
                     array('_', 
                           '.',
                           ''),
                     $text);
echo $text;

第一个正则表达式用单个 _ 替换最后一个句点之前的任何非字母数字字符序列(由正前瞻 (?=.*\.[^.]+$) 确定);第二个用 . 替换 _. 序列(如果它在第一次替换后存在),最后一个删除文件扩展名后的所有字符。

输出:

TEST_JanE_doc30.pdf

Demo on 3v4l.org