【问题标题】:What does this regex match? php regex from mediawiki sourcecode这个正则表达式匹配什么?来自 mediawiki 源代码的 php 正则表达式
【发布时间】:2012-04-12 07:43:54
【问题描述】:

这是一个来自 mediawiki 的正则表达式,一个开源 wiki 解决方案。

/\[((http\:\/\/|https\:\/\/|ftp\:\/\/|irc\:\/\/|ircs\:\/\/|gopher\:\/\/|telnet\:\/\/|nntp\:\/\/|worldwind\:\/\/|mailto\:|news\:|svn\:\/\/|git\:\/\/|mms\:\/\/|\/\/)[^][<>"\x00-\x20\x7F\p{Zs}]+)\p{Zs}*([^\]\x00-\x08\x0a-\x1F]*?)\]/Su

对我来说,它似乎与 uri 匹配,但我无法让它匹配任何东西。我无法理解正则表达式的最后一部分,即。

[^][<>"\x00-\x20\x7F\p{Zs}]+)\p{Zs}*([^\]\x00-\x08\x0a-\x1F]*?)\]

这到底是做什么的?

非常感谢任何有关解码的帮助。

【问题讨论】:

    标签: php regex mediawiki


    【解决方案1】:

    这个正则表达式匹配external links like

    [http://www.stackoverflow.com]
    [https://www.stackoverflow.com StackOverflow]
    [ftp://ftp.mozilla.org Mozilla]
    

    【讨论】:

      【解决方案2】:

      [^][&lt;&gt;"\x00-\x20\x7F\p{Zs}]
      是匹配任何字符的否定字符类,但:][&lt;&gt;"、ASCII 字符范围 \x00-\x20、ASCII 字符 \x7F 和空格(p{Zs} 是匹配任何类型空格字符的 Unicode Character Property

      \p{Zs}* 匹配任何类型的空格字符 0 次或多次

      [^\]\x00-\x08\x0a-\x1F]
      是一个否定字符类,匹配除] 以外的任何字符,ASCII 字符范围为\x00-\x08\x0a-\x1F

      【讨论】:

      • 你第一句话错了。您必须将 [^][&lt;&gt;"\x00-\x20\x7F\p{Zs}] 分为 [^][&lt;&gt;"\x00-\x20\x7F\p{Zs}] ,因为 ] 关闭了字符类并且没有转义。因此,它首先匹配 any 字符,然后匹配第二组指定的字符。
      • 不,[^][&lt;&gt;"\x00-\x20\x7F\p{Zs}] 是一个字符类。第一个] 被视为文字],因为它是列出的第一个字符(或者在这种情况下,在否定^ 之后的第一个字符),就像- 一样。这是一个不错的小隐身功能,我希望所有口味都支持它。
      • @AlanMoore 谢谢,我知道我在某处看到它是这样定义的,我在戳评论后在 Regexr 上进行了测试,但该功能不可用。但是正则表达式只有在这种解释下才有意义。回滚我的答案。
      • @poke 所说的在 JavaScript 中是正确的——我认为这是 ECMAScript 规范的一部分。由于 RegExr 是用 ActionScript3(另一个 ECMAScript 实现)编写的,因此它也遵循“空类”规则。 (我不确定 RegExr 会走哪条路,因为 AS3 将其正则表达式支持外包给与 PHP 相同的 PCRE 库。但是在像 this one 这样的基于 PHP 的测试器上,它可以像我描述的那样工作。)
      • 哦,这很奇怪。不知道这一点,并认为[^] 总是会自己匹配任何东西。一个人每天都会学到一些新东西:o(但我认为转义方括号会更容易区分……)
      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多