帮助在PHP中使用正则表达式替换

时间:2009-07-24 03:20:44

标签: php regex

我在静态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部分不匹配。

这里发生了什么?

3 个答案:

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