PHP正则表达式:拆分未转义的分隔符

时间:2011-12-09 12:42:03

标签: php regex escaping

我可以使用以下代码以key:value;格式拆分字符串:

$inside = "key1:value1;key2:value2;key3:value3;";
preg_match_all("/([^:]+):([^;]+);/s", $inside, $pairs);

我想要做的是通过引入转义符号来允许在值中出现冒号和分号字符。 \;任何以反斜杠开头的冒号或分号都将被忽略。

如果在同一个正则表达式中,奖励积分可以将转义的字符存储在未转义的匹配数组中,而无需通过str_replace运行所有内容。感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:3)

preg_match_all(
    '/(                    # Match and capture...
     (?:                   # either:
      \\\\.                # an escaped character
     |                     # or:
      [^\\\\:]             # any character except : or \
     )+                    # one or more times
    )                      # End of capturing group 1
    :                      # Match a colon
    ((?:\\\\.|[^\\\\;])+); # Same for 2nd part with semicolons
    /x', 
    $inside, $pairs);

这样做。但它不会删除反斜杠。你不能在正则表达式中做到这一点;为此,你需要一个回调函数。

要匹配最终元素,即使它没有以分隔符结尾,也会将;更改为(?:;|$):的相同内容)。要返回空元素,请将+更改为*

答案 1 :(得分:2)

你可以这样做:

$inside = "key\:1:value\;1;key2:value2;key3:value3;";
$pairs = preg_split('/(?<!\\\\);/',$inside,-1,PREG_SPLIT_NO_EMPTY );
foreach($pairs as $pair) {
        list($k,$v) = preg_split('/(?<!\\\\):/',$pair);
        // $k and $v have the key and value respectively.
}

See it