Doğru normal ifadeyi nasıl yapılır

3 Cevap php

Ben $ {1} = Başlık, $ {2} = Aç, $ {3} Bla-bla-bla = almak istiyorum.

itibaren

{{Title|Open
Bla-bla-bla 
}}

3 Cevap

Ne bu böyle bir şey:

$str = <<<STR
{{Title|Open
Bla-bla-bla 
}}
STR;

$matches = array();
if (preg_match("/^\{\{([^\|]+)\|([^\n]+)(.*)\}\}$/s", $str, $matches)) {
    var_dump($matches);
}

Seni alırsınız:

array
  0 => string '{{Title|Open
Bla-bla-bla 
}}' (length=28)
  1 => string 'Title' (length=5)
  2 => string 'Open' (length=4)
  3 => string '
Bla-bla-bla 
' (length=14)

Kullandıktan sonra trim on $matches[1], $matches[2], ve $matches[3], sen :-) istedi ne alırsınız, anlamına gelir


Explaining the regex :

  • dizenin başından eşleşen: ^
  • Onlar özel bir anlamı var gibi, kaçtı gereken iki { karakter,
  • anything that's not a |, at least one time : [^\|]+
    • () bu yüzden esir oluyor arasında - sonucu ilk parçası olarak döndü
    • | da kaçtı zorundadır.
  • Bir | karakter - kaçtı zorundadır.
  • Anything that's not a line-break, at least one time : [^\n]+
    • () yüzden arasında çok yakalanan oluyor - Sonuç ikinci bölümü
  • .* virtually "anything" anynumber of times
    • () yüzden arasında çok yakalanan oluyor - sonucunun üçüncü bölümü
  • ve son olarak, iki } (escaped, too)
  • ve dize bir uç: $

Ve regex s (dotall) değiştirici vardır unutmayın; Pattern Modifiers, bu konuda bkz.

http://www.gskinner.com/RegExr/

oynamak ve Regexes öğrenmek için yararlı bir yer.

Perl:

/\{\{         # literal opening braces
 (.*?)        # some characters except new line (lazy, i. e. as less as possible)
 \|           # literal pipe
 (.*?)        # same as 2 lines above
 \n           # new line
 ([\s\S]*?)   # any character, including new line (lazy)
 \}\}/x;      # literal closing braces

Daha kesin bir çözüm yapma alanlarınızı çıkarılması için istediğiniz ne kesin kurallar bağlıdır.