Używając ASP.NET, jak niezawodnie usunąć znaczniki HTML z danego ciągu (tj. Bez użycia wyrażenia regularnego)? Szukam czegoś takiego jak PHP strip_tags
.
Przykład:
<ul><li>Hello</li></ul>
Wynik:
"Dzień dobry"
Staram się nie wymyślać koła na nowo, ale do tej pory nie znalazłem niczego, co spełniałoby moje potrzeby.
Odpowiedzi:
Jeśli po prostu usuwa wszystkie znaczniki HTML z ciągu znaków, działa to
niezawodnie równieżz wyrażeniem regularnym. Zastąpić:z pustym ciągiem, globalnie. Nie zapomnij później znormalizować łańcucha, zastępując:
z pojedynczą spacją i przycinając wynik. Opcjonalnie zamień dowolne jednostki znaków HTML z powrotem na rzeczywiste znaki.
Uwaga :
>
na wartości atrybutów. Ten roztwór będzie powrotu złamane znaczników po wykryciu tych wartości.użyj odpowiedniego parsera, jeśli musisz to zrobić dobrze w każdych okolicznościach.
źródło
"e;
. Łączę to zWebUtility.HtmlDecode
tym (co z kolei nie usunie tagów). Użyj go po usunięciu tagów, ponieważ może przepisać>
i<
. Np.WebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
Pobierz teraz HTMLAgilityPack! ;) Pobierz LInk
Umożliwia to ładowanie i analizowanie kodu HTML. Następnie możesz nawigować po DOM i wyodrębnić wewnętrzne wartości wszystkich atrybutów. Poważnie, zajmie ci to maksymalnie około 10 linii kodu. Jest to jedna z największych darmowych bibliotek .net.
Oto próbka:
źródło
text()
węzła, przycinać zawartość i ciąg znaków, łączyć te ze spacją.IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
if (doc == null)
czek? To zawsze jest fałszywe, prawda?źródło
RegexOptions.SingleLine
.źródło
Opublikowałem to na forach asp.net i nadal wydaje się, że jest to jedno z najłatwiejszych rozwiązań. Nie gwarantuję, że jest najszybszy lub najbardziej wydajny, ale jest całkiem niezawodny. W .NET możesz używać samych obiektów HTML Web Control. Wszystko, co naprawdę musisz zrobić, to wstawić swój ciąg do tymczasowego obiektu HTML, takiego jak DIV, a następnie użyć wbudowanego 'InnerText', aby pobrać cały tekst, który nie jest zawarty w tagach. Poniżej znajduje się prosty przykład w języku C #:
źródło
Napisałem dość szybką metodę w języku C #, która bije piekło z Regex. Jest hostowany w artykule na CodeProject.
Jego zalety to między innymi lepsza wydajność możliwość zastępowania nazwanych i ponumerowanych encji HTML (takich jak
&amp;
i&203;
) oraz zastępowanie bloków komentarzy i nie tylko.Przeczytaj powiązany artykuł w CodeProject .
Dziękuję Ci.
źródło
Dla tych z Was, którzy nie mogą używać HtmlAgilityPack, czytnik XML .NET jest opcją. Może się to jednak nie powieść w przypadku dobrze sformatowanego kodu HTML, więc zawsze dodawaj haczyk z regx jako kopię zapasową. Zwróć uwagę, że nie jest to szybkie, ale zapewnia dobrą okazję do przejścia przez debugowanie w starej szkole.
źródło
źródło
Dla tych, którzy twierdzą, że rozwiązanie Michaela Tiptopa nie działa, oto sposób na zrobienie tego .Net4 +:
źródło
źródło
Przyjrzałem się proponowanym tutaj rozwiązaniom opartym na Regex i nie dają mi one pewności, z wyjątkiem najbardziej banalnych przypadków. Do złamania wystarczy nawias ostry w atrybucie, nie mówiąc już o nieprawidłowo sformatowanym HTML z „dzikiego”. A co z takimi bytami
&
? Jeśli chcesz przekonwertować HTML na zwykły tekst, musisz również zdekodować jednostki.Dlatego proponuję poniższą metodę.
Korzystając z HtmlAgilityPack , ta metoda rozszerzenia skutecznie usuwa wszystkie tagi HTML z fragmentu HTML. Dekoduje również jednostki HTML, takie jak
&
. Zwraca tylko wewnętrzne elementy tekstowe, z nowym wierszem między każdym elementem tekstowym.Jeśli jesteś naprawdę poważne, że chcesz, aby zignorować zawartości niektórych tagów HTML zbyt (
<script>
,<style>
,<svg>
,<head>
,<object>
przychodzą do głowy!), Ponieważ prawdopodobnie nie zawierają treści czytelne w tym sensie jesteśmy po. To, co tam zrobisz, będzie zależeć od twoich okoliczności i tego, jak daleko chcesz się posunąć, ale używając HtmlAgilityPack byłoby dość trywialne dodanie do białej lub czarnej listy wybranych tagów.Jeśli renderujesz treść z powrotem na stronę HTML, upewnij się, że rozumiesz lukę w zabezpieczeniach XSS i jak temu zapobiec - tj. Zawsze koduj tekst wprowadzony przez użytkownika, który jest renderowany z powrotem na stronie HTML (
>
staje się>
itd.).źródło
W przypadku drugiego parametru, czyli zachowania niektórych tagów, możesz potrzebować kodu takiego jak ten, używając HTMLagilityPack:
Więcej wyjaśnień na tej stronie: http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/
źródło
Możesz to również zrobić za pomocą AngleSharp, który jest alternatywą dla HtmlAgilityPack (nie, że HAP jest zły). Jest łatwiejszy w użyciu niż HAP, aby uzyskać tekst ze źródła HTML.
Możesz rzucić okiem na sekcję kluczowych funkcji, w której argumentują, że są „lepsi” niż HAP. Myślę, że w większości jest to przesada w obecnym pytaniu, ale nadal jest to interesująca alternatywa.
źródło
Po prostu użyj
string.StripHTML();
źródło