我能够使用以下代码拆分格式为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.
}