Wyrażenie regularne, aby usunąć daną (x) tag HTML z ciągiem

głosy
6

Powiedzmy, że mam ciąg trzyma bałagan tekstu i (x) znaczników HTML. Chcę usunąć wszystkie wystąpienia danego znacznika (i wszelkich atrybutów tego znacznika), pozostawiając wszystkie inne tagi i tekst wzdłuż. Jaki jest najlepszy Regex, aby to zrobić?

Edytowany dodać: Oh, doceniam, że przy użyciu regex dla tej konkretnej kwestii nie jest najlepszym rozwiązaniem. , Dla dobra dyskusji możemy założyć jednak, że dana decyzja techniczny powstał kilka poziomów nad moim klasy zapłacić? ;)

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


8 odpowiedzi

głosy
17

Próbując analizować HTML z wyrażeń regularnych jest na ogół bardzo zły pomysł. Użyj zamiast parser, nie powinno być jednym dostępny dla wybranego języka.

Państwo może być w stanie uciec z czymś takim:

</?tag[^>]*?>

Ale to zależy od tego co dokładnie robisz. Na przykład, że nie usunie zawartość tagu i może zostawić HTML w nieprawidłowym stanie, w zależności od znacznika starasz się usunąć. radzi sobie również z nieprawidłowym źle HTML (a jest to dużo, że około).

Użyj parser zamiast :)

Odpowiedział 22/09/2008 o 18:58
źródło użytkownik

głosy
15

Myślę, że jest jakiś poważny anty-regex bigoteria tu dzieje. Istnieje wiele razy, kiedy może chcesz rozebrać konkretny tag z jakiegoś znaczników kiedy to nie ma sensu używać pełnowartościowy parsera.

Oczywiście zdarza się, że parser może być najlepszym rozwiązaniem, ale jeśli szukasz regex następnie:

<script[^>]*?>[\s\S]*?<\/script>

To by usunąć znaczniki skryptów i ich zawartość. Upewnij się, że używasz na wielkość liter.

Jeśli nie chcesz, aby usunąć zawartość znacznika następnie można użyć:

<\/?script[^>]*?>

Przykład użycia w javascript byłoby:

function stripScripts(markup) {
  return markup.replace(/<script[^>]*?>[\s\S]*?<\/script>/gi, '');
}

var safeText = stripScripts(textarea.value);
Odpowiedział 22/09/2008 o 19:09
źródło użytkownik

głosy
0

Podczas korzystania Wyrażenia regularne do analizowania HTML jest zwykle mile widziana lub spojrzał na, prawie na pewno nie chcesz napisać własny parser.

Można jednak korzystać z niektórych funkcji wbudowane lub biblioteki, aby osiągnąć to, czego potrzebujesz.

  • JavaScript jest getElementsByTagNamei getElementById, nie wspominając jQuery .
  • PHP ma DOM rozszerzenie.
  • Python ma niesamowite Piękne Soup
  • ...i wiele więcej.
Odpowiedział 18/05/2009 o 16:17
źródło użytkownik

głosy
0

Oto regex Napisałem do tego celu, to działa w kilku kolejnych sytuacjach:

</?(?(?=b|img|a|script)notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>
Odpowiedział 25/11/2008 o 00:35
źródło użytkownik

głosy
0

Poprawione odpowiedź:

</?TAG\b[^>]*?>

Ponieważ Dans odpowiedź będzie usunąć <br />, ale tylko chcesz<b>

Odpowiedział 04/11/2008 o 02:53
źródło użytkownik

głosy
0

Od szczytu głowy, powiedziałbym, to będzie Ci zacząć w dobrym kierunku.

s/<TAG[^>]*>([^<]*)</TAG[^>]*>/\1

Zasadniczo znaleźć tag początkowy, dowolny tekst pomiędzy znacznikami, a następnie znacznik końcowy. Wymienić całość z tym, co było między tagami.

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

głosy
0

Istnieje zbyt wiele sposobów, może pojawić się jeden tag, nie wspominając kodowania, wariantów, itp
zdecydowanie proponuję przemyśleć to podejście .... naprawdę nie powinni mieć do bezpośredniego przenoszenia HTML, tak.

Odpowiedział 22/09/2008 o 19:01
źródło użytkownik

głosy
0

Myślę, że to może być Raymond Chen (blogs.msdn.com/oldnewthing), że jestem parafrazując (poważnie!) ... Ale tutaj, chcesz wyrażenie regularne? „Teraz masz dwa problemy” ...: =)

Jeśli łańcuch jest dobrze wykształcona (X) HTML, można załadować go do parsera (HTML / XML) i wykorzystuje to, aby usunąć wszelkie węzły odmiany są problemy? Jeśli to nie jest dobrze wykształcona, to staje się nieco bardziej skomplikowane, ale podejrzewam, że regex nie jest najlepszym sposobem, aby przejść na ten temat ...

Odpowiedział 22/09/2008 o 19:00
źródło użytkownik

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