html etiketleri özelliklerini ve değerlerini şerit düzenli ifade

5 Cevap php

Merhaba çocuklar ben regex için çok yeni değilim, bana bu konuda yardımcı olabilir.

Böyle bir dize var "<input attribute='value' >" burada attribute='value' şey olabilir ve ben yapmak bir preg_replace almak için sadece <input /> almak istiyor olabilir

Nasıl bir srting herhangi bir herhangi bir sayıda karakter yerine joker belirtebilirim?

Bu gibi mi? preg_replace("/<input.*>/",$replacement,$string);

Çok teşekkürler

5 Cevap

Ne var:

.*

"herhangi bir karakterle eşleşir ve mümkün olduğu kadar çok olacaktır.

ne mean olduğunu

[^>]+

için çeviren> "" herhangi bir karakter değil, bir şu ", ve en az bir tane olmalı

veya altertaively,

.*?

which means "any character, but only enough to make this rule work"

BUT DONT

Regexplerde ile HTML ayrıştırma olan Bad

mevcut html ayrıştırıcıların herhangi DOM librarys şey, sadece saf değildir Regex kullanın

Örneğin:

 <foo attr=">">

Olarak regex tarafından yanlış yakaladı alacak

'<foo attr=" ' with following text of '">'

Bu regex götürecektir Hangi:

 `<[a-zA-Z]+( [a-zA-Z]+=['"][^"']['"])*)>  etc etc

hangi bu güzel gem keşfedeceksiniz noktada:

 <foo attr="'>\'\"">

ve kafa patlayacak.

(Sözdizimi vurgulayıcı benim açımdan doğrular ve yanlış ben etiketi erdi ettik düşünme eşleşir.)

Bazı insanlar yakın ... ama% 100 idi:

Bu:

preg_replace("<input[^>]*>", $replacement, $string);

bu olmalıdır:

preg_replace("<input[^>]*?>", $replacement, $string);

O açgözlü bir maç olmasını istemiyorum.

preg_replace("<input[^>]*>", $replacement, $string); 
// [^>] means "any character except the greater than symbol / right tag bracket"

Bu gerçekten basic şeyler, sen gerekir catch up with some reading olduğunu. :-)

Ben tavsiye ederim

Regulazy veya regülatör,

both free, both good, both by the awesome Osherove, both can be found here: Roy Osheroves tools

Ben doğru soruyu anlamak, kodu vardır:

preg_replace("/<input.*>/",$replacement,$string);

ve bize ile eşleşen ne silmek için $ değiştirilmesi için kullanmak gerektiğini söylemek istiyorum. *

Bu etrafında başka bir yol hakkında gitmek zorunda. Saklamak istediğiniz yakalamak ve yerine içine takın grupları yakalama kullanın. Örneğin:

preg_replace("/(<input).*(>)/","$1$2",$string);

Sadece edebi metin reinserting konum olarak tabii ki, gerçekten, burada yakalama grupları gerekmez. Durumda etiket değişebilir bir durumda bunu yapmak istiyor, yukarıda gösterilmiş tekniği bahis. Bu daha iyi bir çözümdür:

preg_replace("/<input [^>]*>/","<input />",$string);

Negatif karakter sınıfı nokta daha özeldir. İki HTML etiketleri dize varsa, bu regex çalışacaktır. Orijinal regex olmaz.