如何在PHP中使用preg_replace以扩展名获得干净的字符串?

时间:2019-03-21 05:09:37

标签: php string preg-replace

我想转换这个字符串

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

变成这样的干净字符串

TEST_JanE_doc30.pdf

因此,基本上preg_replace应该是:

  • 将扩展名之前的所有非字母和数字更改为定界符的单个下划线(_)
  • 扩展后删除所有内容
  • 保留文件扩展名(在本例中为.pdf,但可以是其他任何文件)

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

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

2 个答案:

答案 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

Demo on 3v4l.org