PHP regex:分割未转义分隔符


PHP regex : split on unescaped delimiter

我能够使用以下代码拆分格式为key:value;的字符串:

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

我想做的是通过引入转义字符来允许冒号和分号字符在值中出现,例如';,任何紧接反斜杠的冒号或分号都将被忽略。

如果在相同的正则表达式中,那么转义字符可以存储在未转义的匹配数组中,而不必通过str_replace运行所有内容。谢谢你提供的任何帮助。

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);
这是

。不过,它并没有去掉反斜杠。你不能在正则表达式中这样做;为此,您需要一个回调函数。

要匹配最后一个元素,即使它没有以分隔符结束,也要将;更改为(?:;|$) (:也一样)。如果要返回空元素,则将+更改为*

你可以这样做:

$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.
}