替换长字符串中文件名中每个句点的出现次数

时间:2017-03-21 11:14:47

标签: php regex

$text = 'This is a long text containing different image paths like <img src="/site/assets/files/5136/image1.jpg" width="750" />. The text may contain more than one image, here's another one: <img src="/site/assets/files/5136/image1.1.jpg" width="750" />';

请考虑上面的示例文字。我正在寻找一种更好的方法来替换字符串中的文件名中的句点字符,这可能包含多个文件名。 'image1.1.jpg'应该变成'image1_1.jpg',所以这段时间应该用下划线代替。只应替换属于文件名的句点字符。文件名始终如下所示:

/站点/资产/文件/的 5136 / image1.1.jpg

/站点/资产/文件/的 425 / image1.jpg

/站点/资产/文件/的 6524 / image2.x.png

粗体部分是可变的,路径的其余部分始终相同。文件名可能包含也可能不包含句点。扩展名是.jpg或.png,我只想定位图像。

我想用PHP来做这件事。

2 个答案:

答案 0 :(得分:0)

未测试:

$new_text = preg_replace_callback('/(\/site\/assets\/files\/[^\/]+\/)([^\/]+)(\.[a-z0-9]+)/i', function ($matches) {
    return $matches[1] . str_replace('.', '_', $matches[2]) . $matches[3];
}, $text);

正则表达式匹配以/site/assets/files开头的所有路径,后跟一个路径段以及以单个点分隔的扩展名结尾的文件名(如.jpg,但不是.tar.gz)。该匹配包含三个组:文件夹路径($matches[1]),文件名($matches[2])和扩展名($matches[3])。 str_replace用于替换.中带有下划线($matches[2])的所有点(_)。

答案 1 :(得分:-1)

正则表达式相当棘手:

(?:(\/site\/assets\/files\/[^."]+\/[^"\/.]+)\.|\G([^"\/.]+)\.)(?![^."\/]+")

$1$2_替换它。

演示:https://regex101.com/r/6ooSwy/1