我可以使用以下代码以key:value;
格式拆分字符串:
$inside = "key1:value1;key2:value2;key3:value3;";
preg_match_all("/([^:]+):([^;]+);/s", $inside, $pairs);
我想要做的是通过引入转义符号来允许在值中出现冒号和分号字符。 \;
任何以反斜杠开头的冒号或分号都将被忽略。
如果在同一个正则表达式中,奖励积分可以将转义的字符存储在未转义的匹配数组中,而无需通过str_replace
运行所有内容。感谢您提供的任何帮助。
答案 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.
}