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

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$0匹配整个模式。你想要第一组。

1
$replacement = '<img src="$1" />' ;

更好的方法是使用basename作为替换的一部分:

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。