【问题标题】:Help with regex replace in php帮助 php 中的正则表达式替换
【发布时间】:2009-07-24 03:20:44
【问题描述】:

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

它们现在看起来像这样:

它们需要看起来像这样:

所以,我只写了一个 php 脚本,打开每个脚本并执行 preg_replace()。

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


$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/'

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

所以我只在 /images 之后捕获任何内容,直到结束引号。

但我得到的是这样的:

" />

似乎捕获组过于热心并且......或与 /foldera/folderb 部分不匹配。

这是怎么回事?

【问题讨论】:

  • 你可以只使用'basename'函数。
  • 请放过我们的“赞”。向我们提供给您带来麻烦的确切原始和加工生产线。

标签: php regex


【解决方案1】:

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

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

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

$regex = '/(<img src=")([^"]*)"( \\/>)/e';

$replacement = "stripslashes('\$1').basename(stripslashes('\$2')).stripslashes('\$3')";

【讨论】:

  • 大家会用 basename 函数冷静下来吗?真的没有那么好。
  • @bobobobo: basename() 太棒了!它可以在我需要的时候给我很棒的背部按摩!
【解决方案2】:

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

$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/'

这真的让 tkings 更难理解/修改/维护:-(

您可以使用另一个字符作为分隔符,只要它在正则表达式的开头和结尾相同即可。例如,在这种情况下,人们经常使用'#',差不多是这样的:

$regex = '#<img src="/foldera/folderb/folderc/images/([^"]*)" />#'

更容易阅读,不是吗?

(当然,如果你在正则表达式中有 '#',你必须将它们转义,因为它是分隔符)

【讨论】:

  • 整洁!我只是在想“这不是 perl ......”
【解决方案3】:
  • 将索引更改为 1,因为索引 0 指的是整个匹配的字符串,或者

  • 使用“basename”函数,或者

  • 使用以下内容:

    $regex = '//'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 2010-10-02
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多