Tüm çıkmamış yarı-kolonlarda çatlıyor için regex

3 Cevap php

Php en preg_split virgüllerle dayalı bir dize bölmek için kullanıyorum, ama ben olmayan kaçtı yarı-kolonların yalnızca bölünmeye gerek.

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

Üretir:

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

Ben istiyorum zaman üretmek için:

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

Ben denedim "/(^\\)?;/" veya "/[^\\]?;/" ama ikisi de hatalar üretebilir. Herhangi bir fikir?

3 Cevap

Bu çalışıyor.

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

Bu çıkışlar:

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

Bir Negatif Geriye İlerleme faydalanmak gerekir (read about lookarounds). "Her maç düşünün ';' "Bir '\' ile preceed sürece.

Ben PHP regexes gerçekten usta değilim, ama bu bir deneyin:

/(?<!\\);/

Bart sorar beri: Tabii ki de çıkmamış üzerinde bölmek için regex kullanabilirsiniz; ve dikkate kaçtı kaçış karakterleri alır. Sadece biraz dağınık alır:

<?
  $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
      )
)

Ne yapar \ "ve ;) ya da (\) herhangi bir karakter tarafından takip dışında (herhangi bir karakter" için normal bir ifade almak ve ardından bu, herhangi bir sayıda sağlamak; veya dize sonu.

Php $ bir dize içinde sonu-line karakterleri nasıl işleyeceğini emin değilim, sen olanlar için tam olarak ne istediğinizi elde etmek için bazı regex seçeneklerini ayarlamak gerekebilir.