正则表达式分裂所有未转义的分号

时间:2010-01-20 08:14:12

标签: php regex preg-replace

我正在使用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
)

我已尝试"/(^\\)?;/""/[^\\]?;/",但他们都会产生错误。有什么想法吗?

3 个答案:

答案 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如何处理字符串中的$和行尾字符,你可能需要设置一些正则表达式选项以获得你想要的那些。