Rozebrać wszystkie znaczniki HTML oprócz linków

głosy
26

Próbuję napisać wyrażenie regularne rozebrać wszystkie HTML z wyjątkiem linków (The <a hrefi </a>tagów odpowiednio. To nie musi być w 100% bezpieczne (nie jestem zaniepokojony atakami iniekcji lub czymkolwiek jak ja analizowania treści, które już ma zostały zatwierdzone i opublikowane w SWF filmie).

Oryginalny „tags strip” wyrażenie regularne używam było <(.|\n)+?>, a ja starałem się modyfikować go <([^a]|\n)+?>, ale to oczywiście pozwoli dowolny znacznik, który ma A w nim zamiast jednego, który ma go na początku, ze spacją.

Nie, że powinno to większego znaczenia, ale w przypadku gdy ktoś troszczy się poznać Piszę to w języku ActionScript 3.0 dla programu Flash filmu.

Utwórz 04/09/2008 o 17:04
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
26

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

Spróbuj tego. Coś podobnego do tagów s. Pracował dla nich, więc nie rozumiem, dlaczego nie. Używa negatywny uprzedzona do sprawdzenia, że ​​nie pasuje a (z opcjonalnym przedrostkiem / znak), gdzie (za pomocą pozytywnego uprzedzona) A (z opcjonalną / prefiks) następuje a> lub spacja, a następnie rzeczy>. Ten następnie dopasowuje się do następnego> charakteru. Umieścić to w subst z

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

Należy pozostawić tylko otwieranie i zamykanie tagów

Odpowiedział 04/09/2008 o 17:29
źródło użytkownik

głosy
1

Na ogół są problemy z tym podejściem. Regexes są najlepsze dla „płaska” meczów tekstowych - zagnieżdżone dane popycha silniki regex do obszarów, dla których nie są one przeznaczone. Ogólne parsowania HTML nie potrzebuje parsera regex silnika (Google różnicę między regularnych i bezkontekstowych języków, jeśli chcesz pełne dane 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.

Odpowiedział 22/09/2008 o 12:36
źródło użytkownik

głosy
1

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

Odpowiedział 05/09/2008 o 13:41
źródło użytkownik

głosy
0

Proszę bardzo:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
Odpowiedział 28/12/2009 o 09:06
źródło użytkownik

głosy
-1

Co powiesz na

<[^a](.|\n)+?>

?

Odpowiedział 04/09/2008 o 17:09
źródło użytkownik

głosy
-2

strip_tags() to robi.

Tutaj jestem w tym wszystkie <a><p><font><b><i><sup>znaczniki 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
Odpowiedział 13/05/2014 o 21:02
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more