正则表达式适用于Javascript但不适用于PHP preg_match

时间:2013-08-29 12:26:06

标签: php regex

正则表达式:

/([^]+):([^\\r\\n]+)/

字符串:

f1:aaa\r\nf2:bbb\r\nf3:ccc\r\nf4:ddd

根据regexpal.com,这将给出我想要的集:f1 & aaa, f2 & bbb, f3 & ccc等。 但是使用http://www.functions-online.com/preg_match.html我只会看到[0] => "f1" and [1] => "f1"

有人能说明我应该怎么做吗?

3 个答案:

答案 0 :(得分:5)

javascript的某些实现允许[][^]分别为“无字符”“任何字符”。但请记住,这是javascript正则表达式的特殊之处。 (如果您对该主题感兴趣,可以查看this post。)

换句话说,[^][\s\S]的快捷方式,因为javascript没有 dotall 单线模式,其中点可以匹配换行。

因此,要在PHP中获得相同的结果,您必须在结束分隔符后使用单行修饰符[^].替换为s(默认情况下,匹配除换行符之外的任何字符) (?s)之前的.也允许换行。示例:/.+/s/(?s).+/

但是对于你的特殊情况,这种模式似乎更合适:

preg_match_all('~((?>[^rn\\\:]++|(?<!\\\)[rn])+):([^\\\]++)~', $subject, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    echo $match[1].' '.$match[2].'<br/>';
}

模式说明:

~                    # pattern delimiter
(                    # open the first capturing group
    (?>              # open an atomic group
        [^rn\\\:]++  # all characters that are not "r", "n", "\" or ":"
      |              # OR
        (?<!\\\)[rn] # "r" or "n" not preceded by "\"
    )+               # close the atomic group and repeat one or more times
)                    # close the first capturing group
:
(                    # open the second capturing group
    [^\\\]++         # all characters except "\" one or more times
)                    # close the second capturing group
~

<强>通知:

如果要在由单引号括起的字符串中表示\(反斜杠),则必须使用双转义:\\\

这种模式的原理是使用负字符类和否定断言,换句话说,它会查找所需的子字符串不能是什么。

上述模式使用原子组(?>...)和占有量词++代替非捕获组(?:...)和简单量词+。它是相同的,除了正则表达式引擎在原子组和占有量量化器失败时无法返回测试其他方式,因为它不记录回溯位置。你可以通过这种功能赢得表现。

答案 1 :(得分:2)

尝试:

/([a-z0-9]+):([a-z0-9]+)(?:\r\n)?/

/(\w+):(\w+)(?:\r\n)?/

答案 2 :(得分:0)

我认为你需要:

/([^:]+):([^\\r\\n]+)/
//__^ note the colon