【问题标题】:Struggling with php regex挣扎于 php 正则表达式
【发布时间】:2013-04-23 13:51:05
【问题描述】:

我正在为 preg_match_all() 调用的一个非常简单的正则表达式而苦苦挣扎。我正在寻找模仿维基媒体风格的内部链接系统,它将像这样的 [[link]] 变成一个链接。

我正在寻找一个正则表达式,它将在字符串中搜索 [[foobar]] 的任何示例并将“foobar”返回给我。 foob​​ar 应该很狂野。

我尝试了以下方法:

<?php
 $content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
 $links = preg_match_all("[[*]]",$content,$matches);
 print_r($matches);
?>

我什么都没得到。任何帮助将不胜感激。

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    * 本身并不意味着什么。它是一个量词,它需要与其他东西一起使用。在这种情况下,一个点 . 就可以了(意思是“任何事情”)。另外,你可以使用lazy quantifiers而不是贪婪的,一遇到]]就停下来。
    所以...

    $links = preg_match_all("/\[\[(.*?)]]/",$content,$matches);
    

    编辑:
    您必须转义 [,因为它们标志着 character classes 的开始。

    【讨论】:

    • 带有负字符集的所有格量词比惰性量词更合适。
    • 感谢您提供有关如何进行此操作的额外信息。
    • 效果很好。 +1 ?。但请注意@Jacks 评论
    • @Jack 够公平的。虽然我认为惰性量词会使正则表达式比使用否定字符类更有效。
    • 惰性量词会回溯,因此除非必要,否则不应使用。
    【解决方案2】:
    preg_match_all("/\[\[([^\]]*?)\]\]/i",$content,$matches);
    

    【讨论】:

    • ?i 是不必要的。
    【解决方案3】:

    您需要将[ 转义为\[,然后将整体表达式与非贪婪标志U 匹配。

    $content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
    $links = preg_match_all("/\[\[(.*)]]/U",$content,$matches);
    print_r($matches);
    
    Array(
        [0] => Array (
            [0] => [[sit]]
            [1] => [[elit]]
        )
        [1] => Array (
            [0] => sit
            [1] => elit
        )
    )
    

    编辑:用户 ridgerunner 指出使用 /U 修饰符被认为是不好的做法,因为它会使所有匹配的量词变得贪婪,包括不贪婪的量词。建议的匹配代码是 (.*?) 而不是上面发布的,它会产生相同的等效答案。

    $links = preg_match_all("/\[\[(.*?)]]/",$content,$matches);
    

    【讨论】:

    • 谢谢你,我不能再接受10分钟,只是倒计时
    • 感谢您的礼貌。干杯!
    • 永远不要使用 U 标志!最佳做法是始终在正则表达式中的量词本身上使用? ungreedy 修饰符。从来没有需要'U'修饰符的情况,它的唯一目的是混淆。我很少对答案投反对票,但在解决此问题之前,我会对此答案投反对票。 (修复它,我将删除我的反对票)
    • 我回答的目的是显示这家伙最近在哪里犯了错误,而不是指出他什么时候犯了战略错误。感谢您的解释并尊重您的反对意见,但我不会被威胁要更改答案。
    • 你知道'U'标志也会把不贪心的量词变成贪心的吗?对于非平凡的正则表达式(混合了贪婪和不贪婪的量词),'U' 标志只会使事情 very 令人困惑(并且容易出错)。但不要相信我的话,去阅读 Mastering Regular Expressions 3rd Edition。
    【解决方案4】:

    使用以下模式/\[\[(.*)\]\]/U

    $content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
    $links = preg_match_all("/\[\[(.*)\]\]/U",$content,$matches);
    print_r($matches);
    

    解释。正则表达式需要以 / 的分隔符开始和结束。方括号[ 必须在像\[ 这样的正则表达式中转义。括号之间的内容必须在捕获组(.*) 内。最后使用了 ungreedy 修饰符U 以确保仅捕获最近括号之间的内容。 (删除以查看其功能)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2023-04-06
      • 2014-08-30
      • 1970-01-01
      • 2017-12-20
      相关资源
      最近更新 更多