2008-09-04 31 views
26

Tüm HTML'leri sırasıyla (<a href ve </a> etiketler hariç) kesmek için düzenli bir ifade yazmaya çalışıyorum.% 100 güvenli olması gerekmez (Enjeksiyon konusunda endişelenmiyorum) saldırı veya zaten onaylanmış ve) bir SWF film haline yayınlanmıştır içeriği ayrıştırma ediyorum olarak herhangi bir şey.Bağlantılar hariç tüm HTML etiketlerini şeritle çevirme

orijinal "şerit etiketleri" düzenli ifade Ben <(.|\n)+?> oldu kullanarak ediyorum ve <([^a]|\n)+?> bunu değiştirmeye çalıştı, ancak Bu, bir olan herhangi bir etiketin, başlangıçta bir boşlukla baştan sona sahip olan bir etikete izin verecek.

Bu gerçekten önemli değil, ama birisinin bilmesi durumunda Flash film için ActionScript 3.0 yazdım.

cevap

26
<(?!\/?a(?=>|\s.*>))\/?.*?> 

Bunu deneyin. P etiketleri için benzer bir şey vardı. Onlar için çalıştıkları için neden olmasınlar. Negatif bir görünüm kullanarak, bir (bir isteğe bağlı/karakterle öneklenmiş) ((isteğe bağlı/önekle birlikte) a'yı (veya isteğe bağlı/önekle) ardından bir> veya bir boşluk, bir şeyler ve ardından> ile eşleşmediğini kontrol etmek için kullanır. Bu, sonraki> karaktere kadar eşleşir. Sadece açılış ve bu konuda eğer devam bir etiket

+0

kaldırır ... – Geremia

1

kapanış bırakmalısınız

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g; 

Bu bir subst koy ama çok sık regexr tavsiye edebilir yolu yoktur. Bu tür şeyleri test etmek harika.

1

Genel olarak bu yaklaşımda sorunlar var. Düzenli ifadeler 'düz' metin eşleşmeleri için en iyisidir - iç içe geçmiş veriler regex motorlarını tasarlanmadıkları alanlara iter. Genel HTML ayrıştırma bir regex motoru değil bir ayrıştırıcıya ihtiyaç duyar (Google, teknik ayrıntıların tümünü istiyorsanız, düzenli ve bağlamsız diller arasındaki fark için).

Boş dize veya taraflarına kendi eşdeğerleriyle/</ve/>/değiştirilmesi ancak seçici şeyler kırarak yanlışlıkla veya kötü niyetli girişler geniş bir yelpazede karşı savunmasız olacaktır Regexes kullanarak HTML filtreleyerek tüm etiketleri atmak kolaydır. İşte

0

gitmek:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>} 
-2

strip_tags() bunu yapar. İşte

, bütün <a><p><font><b><i><sup> etiketlerini içeren ve bir derli toplu bir sürümünü çıkışı ediyorum:

cat input.htm | tr -d '\n' | php -r '$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");' | tidy -i -wrap 0 -o output.htm