Regex для расщепления на всех неэкранированных точках с запятой - PullRequest
5 голосов
/ 20 января 2010

Я использую php's 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 ]

5 голосов
/ 20 января 2010

Это работает.

<?
  $str = "abc;def\;abc;def";
  $arr = preg_split('/(?<!\\\);/', $str);
  print_r($arr);
?>

Он выводит:

Array
(
    [0] => abc
    [1] => def\;abc
    [2] => def
) 

Вам необходимо использовать отрицательный взгляд сзади ( читать о обходных путях ).Подумайте о «соответствовать всем»;если не предшествует '\' ".

2 голосов
/ 20 января 2010

Я не очень хорошо разбираюсь в регулярных выражениях PHP, но попробуйте это:

/(?<!\\);/
0 голосов
/ 20 января 2010

Поскольку Барт спрашивает: Конечно, вы также можете использовать регулярные выражения, чтобы разделить на неэкранированных; и примите во внимание сбежавшие символы выхода. Просто становится немного грязно:

<?
  $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 обрабатывает $ и символы конца строки в строке, вам может потребоваться установить некоторые параметры регулярного выражения, чтобы получить именно то, что вы хотите для них.

...