2008-09-04 22 views
26

Próbuję napisać wyrażenie regularne, aby usunąć cały HTML z wyjątkiem linków (odpowiednio znaczniki <a href i </a>. Nie musi to być w 100% bezpieczne (nie martwię się wtryskiem ataki lub coś jak ja analizowania treści, które zostały już zatwierdzone i opublikowane w SWF filmu).Usuwam wszystkie znaczniki HTML za wyjątkiem odnośników

oryginalny „tags” taśmy wyrażenie regularne używam był <(.|\n)+?>, a ja starałem się go zmodyfikować, aby <([^a]|\n)+?>, ale to oczywiście pozwoli każdemu znacznikowi, który ma w sobie a, a nie temu, który ma go na początku, z spacją.

Nie, to naprawdę ma znaczenie, ale na wypadek, gdyby ktoś chciał wiedzieć, piszę to w ActionScript 3.0 dla filmu Flash.

Odpowiedz

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

Spróbuj tego. Miał coś podobnego do tagów p. Pracowałem dla nich, więc nie rozumiem, dlaczego nie. Używa negatywnego uprzedzenia, aby sprawdzić, czy nie pasuje do a (poprzedzone opcjonalnym/znakiem), gdzie (za pomocą dodatniej uprzedniej) a (z opcjonalnym/przedrostkiem) następuje a> lub spacja, rzeczy i potem>. To pasuje do następnego znaku. Umieścić to w subst z

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

To powinno pozostawić tylko otwieranie i zamykanie tagów

+0

To nie działa na mnie z 'sed' ... – Geremia

1

wracamy na ten temat, ale nie ma sposobu, mogę polecić regexr zbyt często. To fantastyczne do testowania tego typu rzeczy.

1

Generalnie występują problemy z tym podejściem. Regeksy są najlepsze dla "płaskich" dopasowań tekstowych - zagnieżdżone dane wypychają silniki regex do obszarów, dla których nie zostały zaprojektowane. Ogólne parsowanie HTML wymaga parsera, a nie silnika regex (Google, aby odróżnić języki regularne od bezkontekstowych, jeśli chcesz uzyskać pełne szczegóły techniczne).

Łatwo jest rozebrać się wszystkie znaczniki zastępując/</i/>/z pustym ciągiem znaków lub ich ekwiwalentów jednostki ale wybiórczo filtrowanie HTML przy użyciu regexes będą narażone na szerokim zakresie przypadkowych lub złośliwych wejść łamanie rzeczy.

0

Proszę bardzo:

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

strip_tags() to robi.

Tutaj jestem w tym wszystkie <a><p><font><b><i><sup> tagi i wyprowadzania wersję sprzątana:

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