$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来做这件事。
答案 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_
替换它。