Jaki jest najlepszy sposób zaznaczenia całego tekstu między dwoma tagami - np. Tekst między wszystkimi tagami „przed” na stronie.
html
regex
html-parsing
basheps
źródło
źródło
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Odpowiedzi:
Możesz użyć
"<pre>(.*?)</pre>"
, (zastępując pre dowolnym tekstem) i wyodrębnić pierwszą grupę (dla bardziej szczegółowych instrukcji określ język), ale zakłada to uproszczone założenie, że masz bardzo prosty i poprawny HTML.Jak sugerowali inni komentatorzy, jeśli robisz coś złożonego, użyj parsera HTML.
źródło
<pre>
tagi po próbie<pre>(.*?)<\/pre>
, to dlatego, że patrzysz na to, co zostało przechwycone przez pełne dopasowanie, a nie przez grupę przechwytywania (. *?). Brzmi tandetnie, ale zawsze myślę, że „nawias = para złodziei”, ponieważ jeśli nie(
nastąpi po nim?
jak w(?:
lub(?>
, każdy mecz będzie miał dwa przejęcia: 1 za cały mecz i 1 za grupę przechwytującą. Każdy dodatkowy zestaw nawiasów powoduje dodatkowe przechwycenie. Musisz tylko wiedzieć, jak pobrać oba przechwytywania w dowolnym języku, z którym pracujesz.Tag można uzupełnić w innej linii. Dlatego
\n
należy dodać.źródło
(.|\n)*?
przypadku tagów HTML w wielu wierszach. Wybrana odpowiedź działa tylko wtedy, gdy tagi HTML znajdują się w tej samej linii.(.|\n)*?
do dopasowania żadnego znaku. Zawsze używaj.
zs
modyfikatorem (singleline). Lub[\s\S]*?
obejście./\*(.|\n)*?\*/
który wykonał zadanie - dziękujęTo jest to, czego bym użył.
Zasadniczo to, co robi, to:
(?<=(<pre>))
Wybór należy poprzedzić<pre>
tagiem(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
To jest tylko wyrażenie regularne, które chcę zastosować. W tym przypadku wybiera literę, cyfrę lub znak nowego wiersza lub niektóre znaki specjalne wymienione w przykładzie w nawiasach kwadratowych. Pionowa|
kreska oznacza po prostu „ LUB ”.+?
Stany znaku plus, aby wybrać jeden lub więcej z powyższych - kolejność nie ma znaczenia. Znak zapytania zmienia domyślne zachowanie z „zachłannego” na „niezadowolony”.(?=(</pre>))
Wybór musi być dołączony do</pre>
taguW zależności od przypadku użycia może być konieczne dodanie modyfikatorów, takich jak ( i lub m )
Tutaj przeprowadziłem to wyszukiwanie w Sublime Text, więc nie musiałem używać modyfikatorów w moim wyrażeniu regularnym.
Javascript nie obsługuje lookbehind
Powyższy przykład powinien działać dobrze z takimi językami jak PHP, Perl, Java ... Javascript nie obsługuje jednak lookbehind, więc musimy zapomnieć o używaniu
(?<=(<pre>))
i poszukać jakiegoś obejścia. Być może po prostu usuń pierwsze cztery znaki z naszego wyniku dla każdego zaznaczenia, tak jak tutaj Regex dopasowuje tekst między tagamiZobacz również w dokumentacji JavaScript REGEX dla non-przechwytywanie nawiasach
źródło
użyj poniższego wzorca, aby uzyskać zawartość między elementem. Zastąp
[tag]
rzeczywisty element, z którego chcesz wyodrębnić zawartość.Czasami tagi będą miały atrybuty, takie jak
anchor
posiadanie taguhref
, a następnie użyj poniższego wzorca.źródło
<[tag]>
będzie pasował<t>
,<a>
i<g>
Replace [tag] with the actual element you wish to extract the content from
część.[]
należało całkowicie pominąć. Byłoby to bardziej jasne, ze względu na ich znaczenie w RegEx oraz fakt, że ludzie najpierw skanują kod, a potem czytają tekst;)Aby wykluczyć znaczniki ograniczające:
(?<=<pre>)
szuka tekstu po<pre>
(?=</pre>)
szuka tekstu wcześniej</pre>
Wyniki będą zawierać tekst wewnątrz
pre
taguźródło
Nie powinieneś próbować analizować html za pomocą wyrażeń regularnych, zobacz to pytanie i jak się okazało.
Mówiąc najprościej, html nie jest językiem zwykłym, więc nie można w pełni przeanalizować tego za pomocą wyrażeń regularnych.
Powiedziawszy, że możesz analizować podzbiory html, gdy nie ma zagnieżdżonych podobnych tagów. Tak więc, o ile wszystko pomiędzy i nie jest tym tagiem, zadziała:
Lepszym pomysłem jest użycie parsera, takiego jak natywny DOMDocument, do załadowania kodu HTML, a następnie wybranie tagu i uzyskanie wewnętrznego kodu HTML, który może wyglądać mniej więcej tak:
A ponieważ jest to właściwy parser, będzie w stanie obsłużyć tagi zagnieżdżania itp.
źródło
php
. Nie jestem pewien, jak pojawił się PHP ...Spróbuj tego....
źródło
Wydaje się, że jest to najprostsze wyrażenie regularne ze wszystkich, jakie znalazłem
(?:<TAG>)
z dopasowań([\s\S]*)
w dopasowaniach wszelkie znaki spacji lub inne niż białe znaki(?:<\/TAG>)
z dopasowańźródło
Ta odpowiedź zakłada wsparcie dla rozglądania się! Pozwoliło mi to zidentyfikować cały tekst między parami znaczników otwierających i zamykających. To cały tekst między znakami „>” i „<”. Działa, ponieważ rozglądanie się nie zużywa dopasowanych znaków.
(? <=>) ([\ w \ s] +) (? = </)
Przetestowałem to na https://regex101.com/ używając tego fragmentu HTML.
To gra składająca się z trzech części: spojrzenia za siebie, treści i spojrzenia w przyszłość.
Mam nadzieję, że będzie to początek dla 10. Szczęścia.
źródło
Ponieważ zaakceptowana odpowiedź jest bez kodu javascript, więc dodaj, że:
źródło
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
to wyrażenie regularne wybierze wszystko między tagami. nieważne, czy jest w nowej linii (praca z multiline.źródło
W Pythonie ustawienie
DOTALL
flagi przechwyci wszystko, w tym znaki nowej linii.python example.py
Przechwytywanie tekstu między wszystkimi otwierającymi i zamykającymi tagami w dokumencie
finditer
Przydatne jest przechwytywanie tekstu między wszystkimi otwierającymi i zamykającymi znacznikami w dokumencie . W poniższym przykładzie w ciągu występują trzy<pre>
znaczniki otwierające i zamykające .python example2.py
źródło
W przypadku wielu linii:
źródło
Możesz użyć
Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
źródło
Używam tego rozwiązania:
źródło
W Javascript (między innymi) jest to proste. Obejmuje atrybuty i wiele linii:
źródło
źródło