我正在使用php的preg_split来分割基于分号的字符串,但是我需要它才能拆分非转义的分号。
<?
$str = "abc;def\\;abc;def";
$arr = preg_split("/;/", $str);
print_r($arr);
?>
产地:
Array
(
[0] => abc
[1] => def\
[2] => abc
[3] => def
)
当我希望它产生时:
Array
(
[0] => abc
[1] => def\;abc
[2] => def
)
我已尝试"/(^\\)?;/"
或"/[^\\]?;/"
,但他们都会产生错误。有什么想法吗?
答案 0 :(得分:5)
这很有效。
<?
$str = "abc;def\;abc;def";
$arr = preg_split('/(?<!\\\);/', $str);
print_r($arr);
?>
输出:
Array
(
[0] => abc
[1] => def\;abc
[2] => def
)
您需要使用负面的后视(read about lookarounds)。想想“匹配所有”;'除非前面有'\'“。
答案 1 :(得分:2)
我不是很熟悉PHP正则表达式,但试试这个:
/(?<!\\);/
答案 2 :(得分:0)
因为巴特问道:当然你也可以使用正则表达式分裂未转义;并将转义的转义字符考虑在内。它只是有点乱:
<?
$str = "abc;def\;abc\\\\;def";
preg_match_all('/((?:[^\\\\;]|\\\.)*)(?:;|$)/', $str, $arr);
print_r($arr);
?>
Array
(
[0] => Array
(
[0] => abc;
[1] => def\;abc\\;
[2] => def
)
[1] => Array
(
[0] => abc
[1] => def\;abc\\
[2] => def
)
)
这样做是为了“(任何字符除了\和;)或(\后跟任何字符)”的正则表达式“并允许任意数量的那些,后跟一个;或者字符串的结尾。
我不确定php如何处理字符串中的$和行尾字符,你可能需要设置一些正则表达式选项以获得你想要的那些。