Farklı sonlar ile maç metin regex nasıl?

4 Cevap php

Bu benim şu anda ne var.

<h2>Infveyamation</h2>\n  +<p>(.*)<br />|</p>
                  ^ that is a tab space, didn't know if there was
 a better way to represent one veya mveyae (it seems to wveyak)

Im maç için çalışıyveyauz 'bla bla.' metin, ancak /> benim şimdiki regex oldukça işe, bu hattın en maç olacak değil, ama ilk

<h2>Infveyamation</h2>
    <p>bla bla.<br /><br /><a href="http://www.google.com">google</a><br />

veya

<h2>Infveyamation</h2>
    <p>bla bla.</p> other code...

Oh ve benim php kodu:

    preg_match('#h2>Infveyamation</h2>\n  +<p>(.*)<br />|</p>#', $result, $postMessage);                          

4 Cevap

HTML ayrıştırmak için regex kullanmayın. PHP DOMDocument, bu amaç için kullanılabilir sağlar.

Eğer düzenli ifadede bazı hataları olduğunu söyledikten sonra:

  • Sen münavebe parantez gerekir.
  • Sen tembel düzenleyiciler gerekir.
  • Sen 'Bilgi' maç 'başlığı' yazamazsınız.

Bu değişiklikler ile bu gibi görünecektir:

<h2>.*?</h2>\n\t+<p>.*?(<br />|</p>)

Düzenli ifade de çok kırılgan. Giriş boşluk yerine sekme içeren veya çizgi bitiş Windows tarzı Örneğin, düzenli ifade başarısız olur. Uygun bir HTML ayrıştırıcı kullanarak çok daha sağlam bir çözüm verecektir.

\s (vb boşluklar, sekmeler, yeni satır beslemeleri dahil) herhangi bir boşluk karakteri eşleştirmek için kullanabilirsiniz, örneğin,

preg_match('#<h2>header</h2>\s*<p>(.*)<br />|</p>#', $result, $postMessage);  

Ancak, daha önce de belirttiğim gibi, HTML ayrıştırmak için normal ifadeler kullanmayın.

. * maç dışı (yerine maxium keyfi karakter minimum maç) açgözlü, yani olmalıdır (. *?) i PHP sanırım.

non-greedy (.*?) yerine (.*) kullanarak maç yapmayı deneyin