如何通过分隔符拆分字符串,但如果字符串被转义则不能?例如,我有一个字符串:
1|2\|2|3\\|4\\\|4
分隔符是|
,转义的分隔符是\|
。此外,我想忽略转义的反斜杠,因此在\\|
中,|
仍然是分隔符。
因此,使用上面的字符串,结果应该是:
[0] => 1
[1] => 2\|2
[2] => 3\\
[3] => 4\\\|4
发布于 2011-06-05 23:20:46
使用黑魔法:
$array = preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $string);
\\\\.
匹配后跟字符的反斜杠,(*SKIP)(*FAIL)
跳过它,\|
匹配您的分隔符。
发布于 2011-06-06 13:52:09
最近,我想出了一个解决方案:
$array = preg_split('~ ((?<!\\\\)|(?<=[^\\\\](\\\\\\\\)+)) \| ~x', $string);
但黑魔法解决方案的速度仍然快了三倍。
发布于 2015-01-03 03:27:17
正则表达式的运行速度非常慢。一种更好的方法是在拆分之前从字符串中删除转义字符,然后将它们放回其中:
$foo = 'a,b|,c,d||,e';
function splitEscaped($str, $delimiter,$escapeChar = '\\') {
//Just some temporary strings to use as markers that will not appear in the original string
$double = "\0\0\0_doub";
$escaped = "\0\0\0_esc";
$str = str_replace($escapeChar . $escapeChar, $double, $str);
$str = str_replace($escapeChar . $delimiter, $escaped, $str);
$split = explode($delimiter, $str);
foreach ($split as &$val) $val = str_replace([$double, $escaped], [$escapeChar, $delimiter], $val);
return $split;
}
print_r(splitEscaped($foo, ',', '|'));
它在“,”上拆分,但如果用"|“转义就不会。它还支持双重转义,因此在拆分发生后,"||“变成了单个"|”:
Array ( [0] => a [1] => b,c [2] => d| [3] => e )
https://stackoverflow.com/questions/6243778
复制相似问题