我想转换这个字符串
$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);
答案 0 :(得分: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]+).*$/', '$1', $parts[1]);
print_r($parts);
$file = $filename . $ext;
echo $file;
TEST_JanE_doc30.pdf
答案 1 :(得分:1)
您可以通过3阶段替换执行此操作。请注意,我已经假设文件扩展名是紧接最后一个句点之后的字母数字字符,所有其他字符(例如测试数据中的3
)都将被丢弃。
$text = "TEST#%_'JanE,.-_doc30)/||\.pdf$@!3)";
$text = preg_replace(array('/[^\dA-Za-z]+(?=.*\.[^.]+$)/',
'/_\./',
'/(\.[\dA-Za-z]+).*$/'),
array('_',
'.',
'$1'),
$text);
echo $text;
第一个正则表达式将最后一个句点之前的任何非字母数字字符序列(由正向(?=.*\.[^.]+$)
确定)替换为单个_
;第二个序列将_.
序列(如果在第一次替换之后存在)替换为.
,最后一个序列将删除文件扩展名之后的所有字符。
输出:
TEST_JanE_doc30.pdf