我在静态html文件中有一堆网址需要更改。
他们现在看起来像这样:
<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />
他们需要看起来像这样:
<img src="imgxyz.jpg" />
所以,我刚写了一个php脚本,打开每个脚本并执行preg_replace()。
我的正则表达式(带有双重反斜杠,是的):
$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/'
$replacement = '<img src="$0" />' ;
所以我只是在/ images之前捕获任何东西,直到收尾报价。
但我得到的是:
<img src="<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />" />
似乎捕获组过于热心......或者某些东西与/ foldera / folderb部分不匹配。
这里发生了什么?
答案 0 :(得分:5)
使用$1
进行替换。 $0
匹配整个模式。你想要第一组。
$replacement = '<img src="$1" />' ;
更好的方法是使用basename
作为替换的一部分:
$regex = '/(<img src=")([^"]*)"( \\/>)/e';
$replacement = "stripslashes('\$1').basename(stripslashes('\$2')).stripslashes('\$3')";
答案 1 :(得分:1)
正如旁注,现在已经回答了问题:如果你在正则表达式中有斜杠'/
',使用斜杠作为分隔符会强制你逃避正则表达式中的那些,就像你提出的例子一样:
$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/'
这确实使得tkings更难理解/修改/维护: - (
您可以使用其他字符作为分隔符,只要它在正则表达式的开头和结尾处相同即可。例如,在这种情况下,人们经常使用“#
”,非常类似:
$regex = '#<img src="/foldera/folderb/folderc/images/([^"]*)" />#'
易于阅读,不是吗?
(当然,如果你在正则表达式中有'#
',你将不得不逃避它们,因为它是分隔符)
答案 2 :(得分:0)
将索引更改为1,因为索引0表示整个匹配的字符串,或
使用“basename”功能或
使用以下内容:
$ regex ='//'
在这种情况下,您必须将索引更改为2。