Help with regex replace in php
我在静态HTML文件中有一堆需要更改的URL。
它们现在看起来像这样:
1 | <img src="/foldera/folderb/folderc/images/imgxyz.jpg" /> |
他们需要看起来像这样:
1 | <img src="imgxyz.jpg" /> |
所以,我刚刚编写了一个PHP脚本,打开每个脚本并执行preg_replace()。
我的regex(用双转义反斜杠,是的):
1 2 3 | $regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/' $replacement = '<img src="$0" />' ; |
因此,我只捕获结束引号之前的所有图像。
但我得到的是:
1 | <img src="<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />" /> |
看来俘虏小组过于热心…或者某些内容与/foldera/folderb部分不匹配。
这是怎么回事?
更换时使用
1 | $replacement = '<img src="$1" />' ; |
更好的方法是使用
1 2 3 | $regex = '/(<img src=")([^"]*)"( \\/>)/e'; $replacement ="stripslashes('\$1').basename(stripslashes('\$2')).stripslashes('\$3')"; |
正如旁注,现在问题已经得到了解答:如果在regex中使用了斜杠"EDOCX1"〔3〕,则使用斜杠作为分隔符将强制您避开regex中的斜杠,就像您提出的示例一样:
1 | $regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/' |
它确实使tkings更难理解/修改/维护:-(
您可以使用另一个字符作为分隔符,只要它在regex的开头和结尾是相同的。例如,在这种情况下,人们通常使用"EDOCX1"(4),大致如下:
1 | $regex = '#<img src="/foldera/folderb/folderc/images/([^"]*)" />#' |
更容易阅读,不是吗?
(当然,如果regex中有'
将索引更改为1,因为索引0指的是整个匹配的字符串,或者
使用"basename"函数,或
使用以下内容:
$ReX='//'
在这种情况下,您必须将索引更改为2。