php中正则表达式替换的帮助

php中正则表达式替换的帮助,php,regex,Php,Regex,我在静态html文件中有一堆URL需要更改 它们现在看起来像这样: <img src="/foldera/folderb/folderc/images/imgxyz.jpg" /> 它们需要像这样: <img src="imgxyz.jpg" /> 所以,我刚刚编写了一个php脚本,它打开每个文件并执行preg_replace() 我的正则表达式(带有双转义反斜杠,是的): $regex='/' $replacement=''; 因此,在结束引用之前,我只在/图像之后

我在静态html文件中有一堆URL需要更改

它们现在看起来像这样:

<img src="/foldera/folderb/folderc/images/imgxyz.jpg" /> 它们需要像这样:

<img src="imgxyz.jpg" /> 所以,我刚刚编写了一个php脚本,它打开每个文件并执行preg_replace()

我的正则表达式(带有双转义反斜杠,是的):


$regex='/'
$replacement='';
因此,在结束引用之前,我只在/图像之后捕获任何内容

但我得到的是:

<img src="<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />" /> " /> 捕获组似乎过于热心,或者……或者与/foldera/folderb部分不匹配


这是怎么回事?

使用
$1
替换。
$0
匹配整个模式。您想要第一组

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

使用
$1
进行替换。
$0
匹配整个模式。您需要第一组

$replacement = '<img src="$1" />' ;
  • 将索引更改为1,因为索引0引用整个匹配字符串,或者

  • 使用“basename”函数,或

  • 使用以下命令:

    $regex='/'

在这种情况下,您必须将索引更改为2。

  • 将索引更改为1,因为索引0引用整个匹配字符串,或者

  • 使用“basename”函数,或

  • 使用以下命令:

    $regex='/'


在这种情况下,您必须将索引更改为2。

就像旁注一样,现在问题已经得到了回答:如果您在正则表达式中有斜杠“
/
”,则使用斜杠作为分隔符会迫使您转义正则表达式中的斜杠,如您建议的示例:

$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/'
更容易阅读,不是吗


(当然,如果你在正则表达式中有“
,你就必须对它们进行转义,因为它是分隔符)

作为旁注,现在问题已经得到了回答:如果你在正则表达式中有斜杠“
/
”,使用斜杠作为分隔符会迫使你转义正则表达式中的斜杠,就像你建议的例子:

$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/'
更容易阅读,不是吗


(当然,如果你在正则表达式中有“
#
”,你就必须对它们进行转义,因为它是分隔符)

你可以只使用“basename”函数。请省去“like”。给我们一个给你带来麻烦的原始行和处理行。你可以只使用“basename”函数。请省去“like”“。请给出给您带来麻烦的原始行和处理行。使用basename函数,您能冷静下来吗?”?“真的没那么好。@bobobo:
basename()
太棒了!当我需要的时候,它可以给我惊人的背部按摩!你们能用basename函数冷静下来吗?“真的没那么好。@bobobo:
basename()
太棒了!当我需要的时候,它可以给我惊人的背部按摩!整洁的我只是在想“这不是perl…”太好了!我只是在想“这不是perl…”
$regex = '#<img src="/foldera/folderb/folderc/images/([^"]*)" />#'