Ilk çift yeni hat metin kadar bir blok maç için düzenli ifade?

4 Cevap php

Ben basit Tekstil ayrıştırıcı yapıyorum ve "alıntı bloğudur" için normal bir ifade yazmak için çalışıyorum ama zorluk birden çok yeni uyan satırları yaşıyorum. Örnek:

bq. first line of quote
second line of quote
third line of quote

not part of the quote

Bu preg_replace() yani temelde arasındaki her şeyi eşleşmesi gerekir "bq." ve ilk çift yeni çizgi karşılaşır aracılığıyla blockquote etiketleri ile değiştirilecektir. Ben yönetebilirsiniz iyi alıntının ilk satırı elde etmektir. Teşekkürler

4 Cevap

Bu regex deneyin:

(?s)bq\.((?!(\r?\n){2}).)*+

anlamı:

(?s)           # enable dot-all option
b              # match the character 'b'
q              # match the character 'q'
\.             # match the character '.'
(              # start capture group 1
  (?!          #   start negative look ahead
    (          #     start capture group 2
      \r?      #       match the character '\r' and match it once or none at all
      \n       #       match the character '\n'
    ){2}       #     end capture group 2 and repeat it exactly 2 times
  )            #   end negative look ahead
  .            #   match any character
)*+            # end capture group 1 and repeat it zero or more times, possessively

\r?\n Windows, * nix ve (yeni) MacOS satır sonları maçlar. Eğer gerçek eski Mac bilgisayarlar için hesap gerekiyorsa, ona tek \r ekleyin: \r?\n|\r

Bu işe misiniz?

'/(.+)\n\n/s'

Ben 's' tek satır anlamına gelir inanıyoruz.

Edit: Ehr, soru oynanırsa .. "bq." anlamlıydı.

echo preg_replace('/^bq\.(.+?)\n\n/s', '<blockquote>$1</blockquote>', $str, 1);

Bazen web formlari üzerinden girilen data \ r \ n yerine sadece bunu yapmak hangi \ n arasında bulunmaktadır

echo preg_replace('/^bq\.(.+?)\r\n\r\n/s', '<blockquote>$1</blockquote>', $str, 1);

Questionmark ilk çift dönüş bulundu sonra kapanış blockquotes eklemek yapar ("non-açgözlü" Ben denir inanıyorum), bu yüzden başka bir çift döner (ki ne istediğinizi değilse, belli ki onu dışarı almak) yalnız bırakılır.

Içgüdülerim bana böyle bir şey söyle ...

preg_match("/^bq\. (.+?)\n\n/s", $input, $matches)

Yukarıdaki adam RegEx'in sonunda / sonra s bayrak . yeni satır karakterlerini maç olacak anlamına gelir, dediği gibi. Genellikle, bu olmadan, RegExs bir tek satır şey türüdür.

Sonra soru işareti ? olabildiğince .+ eşleşmiyor böylece .+ olmayan açgözlü maç gösterir sonra; \n\n ilk kullanılabilir çift çizgi maç olacak, böylece bunun yerine, minimum olası maç olacak.

Için ne ölçüde Tekstil özelliklerini desteklemeyi planlıyorsanız? Tekstil gibi şeyler verir gibi RegEx, oldukça karmaşık alabilirsiniz çünkü ...

bq.. This is a block quote

This is still a block quote

veya ...

bq(funky). This is a block quote belonging to the class funky!

bq{color:red;}. Block quote with red text!

Tüm teknik regex yerine hangi galiba, idare etmek mümkün olmayacaktır.