PHP regex geribaşvuru

2 Cevap php

Ben bir html etiketi özelliklerini eşleştirmek çalışıyorum, ama çalışma olamıyorum :)

Kullanıcı örneğin bu etiketi atalım:

<a href="ddd" class='sw ' w'>

Açıkçası son bölümü oldukça doğru değildir.

Şimdi bu kod parçası ile nitelikler bölümünü maç için çalıştı:

preg_match('/(\s+\w+=(?P<quote>(\'|\"))[^(?P=quote)]*(?P=quote))*/U', " href=\"bla\" class='sw'sw'", $a);

Here $a is empty, and that's what I expect. But if I now take my complete expression it does match the last class part, which puzzles me. It looks like this:

preg_match('/<(?P<c>[\/]?)(?P<tag>\w+)(?P<atts>(\s+\w+=(?P<quote>(\'|\"))[^(?P=quote)]*(?P=quote))*)\s*(?P<sc>[\/]?)>/U', $tag, $a);

Şimdi İade:

Array
(
[0] => <a href="ddd" class='sw ' w'>
[c] => 
[1] => 
[tag] => a
[2] => a
[atts] =>  href="ddd" class='sw ' w'
[3] =>  href="ddd" class='sw ' w'
[4] =>  class='sw ' w'
[quote] => '
[5] => '
[6] => '
[sc] => 
[7] => 
)

Ben sonunda (U) ngreedy anahtarını kullanın yaptı ise, w 'son dahil sınıf bölümünü içeren 4. tuşuna dikkat edin.

Herhangi bir ipucu?

2 Cevap

Gerçekten denemek ve regex HTML kötü bir fikirdir - bir DOM Inspector bunu yapabilirsiniz PHP için vardır.

[^ (? P = alıntı)]

Bunu yapamazsın. Karakter sınıfları sadece, tek bir ters eğik çizgi karakterleri içeren-kaçar ve - aralıkları; Bu karakter sınıfı böylece (, ), ?, P değişmez karakterlerden herhangi ve eşleşir.

Ayrıca, (?P=quote) özyinelemeli ifade var, bir geribaşvuru değildir. Bu, daha önce tanımı düzenli ifade alır:

(?P<quote>(\'|\"))

ve böylece ya da 'ya da "ne olursa olsun hangi alıntı öznitelik değerinin başında kullanıldı maçlar. Backrefs \1 numaralı () eşleştirme gibi ifadeler ile yapılır maç grup.

Ama yine de, haktır squeeks: regex [X] [HT] ML ayrıştırma toplam kaybeden bir oyun. Eğer doğru tüm olası biçimlendirme davranır bir ifade ile gelmeyecek. Zaman israf Dur ve bir XML veya HTML parser kullanın.