【问题标题】:What Delimiter to use for preg_replace in PHP (replace working outside of PHP but not inside)在 PHP 中用于 preg_replace 的分隔符(替换在 PHP 外部工作但不在内部工作)
【发布时间】:2010-12-01 09:08:27
【问题描述】:

我自己和我的团队都被困在这个问题上,我有以下代码。

$text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut bibendum augue eu arcu mollis cursus. Curabitur nec purus ipsum. Fusce ut erat leo, vitae malesuada lacus. Quisque varius gravida justo ut aliquam. Integer accumsan, ante non volutpat semper, orci sem luctus odio, sit amet convallis odio justo id nisl. Nunc sed lacus nisi, quis accumsan massa. Donec ante enim, fermentum sit amet placerat nec, eleifend elementum nibh

[[BLOGIMAGE_20090303011757.jpg||480]]

us dolor nec est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam accumsan blandit purus eget vestibulum. Nullam neque sem, suscipit sit amet mattis eu, imperdiet quis ligula. Integer aliquam dapibus gravida. Pellentesque ultrices sapien orci. Suspendisse at eros non dolor accumsan cursus mattis nec justo.

[[BLOGIMAGE_20090303011819.jpg||480]]

Aenean cursus lacinia arcu vitae malesuada. Fusce fermentum enim sit amet elit fermentum at consectetur ante vulputate. Aliquam sagittis nulla id magna facilisis tempus. Suspendisse eget feugiat libero. Pellentesque non lorem sem, eu posuere velit. Nulla id nulla ligula.

[[BLOGIMAGE_20090303011842.jpg||480]] ..... etc";
$pat  = "\[\[(.*)\|\|(.*)\]\]";
$mat  = '<img src="/path/to/file/imgs/$1" width="$2px" />';
$text = preg_replace($pat , $mat, $text);

我们要做的是使用 $mat 中的结构将 [[imagefile||size]] 转换为图像标签。这场比赛在 RegExr(一个 adobe air 程序)和 verious javascript 在线测试人员中完美运行

我得到的错误是:-

消息:preg_replace() [function.preg-replace]:分隔符 不能是字母数字或反斜杠

所以如果我添加一个分隔符,比如...

$pat = "^[[(.)\|\|(.)]]^";

然后匹配停止工作,但我不再收到任何错误。

任何帮助都将不胜感激。

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    preg_replace() 需要分隔符:

    preg_replace("/$pat/" ...
    

    传统上它是正斜杠,但它可以是任何字符 - 特别是当您需要正则表达式本身中的正斜杠时,您可以求助于另一个字符。

    这种灵活性允许您将"/http:\/\/foo\/bar\//"(“倾斜牙签综合症”)表示为"!http://foo/bar/!"。

    分隔符是分隔正则表达式和正则表达式标志(也称为“修饰符”)所必需的,例如:

    preg_replace("/$pat/i" ...
    

    ...这使用i 标志来声明不区分大小写的正则表达式。

    【讨论】:

    • 非常感谢,这对它进行了排序,现在一切都变得有意义了。它也失败了,因为管道是 ||... 所以查看源代码也很好 =)
    【解决方案2】:

    来自PHP manual on PCRE delimiters:

    分隔符可以是任何非字母数字、非反斜杠、非空白字符。

    常用的分隔符是正斜杠 (/)、井号 (#) 和波浪号 (~)。

    因此您可以使用/ 作为分隔符将模式与可选的modifiers 分开:

    /\[\[(.*)\|\|(.*)\]\]/
    

    但还要注意:

    除了上述分隔符之外,还可以使用括号样式的分隔符,其中开始和结束括号分别是开始和结束分隔符。

    此外,目前您的模式将尽可能匹配,因为quantifiers 都是贪婪的;您可能希望将它们更改为不愿意只匹配尽可能少:

    /\[\[(.*?)\|\|(.*?)\]\]/
    

    【讨论】:

      【解决方案3】:

      试试

      $pat  = "/\[\[(.*)\|\|(.*)\]\]/m";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多