Jaki jest najlepszy sposób zaznaczenia całego tekstu między dwoma tagami - np. Tekst między wszystkimi tagami „przed” na stronie.
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Jaki jest najlepszy sposób zaznaczenia całego tekstu między dwoma tagami - np. Tekst między wszystkimi tagami „przed” na stronie.
/<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.
<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ć.
<PRE>(.|\n)*?<\/PRE>
(.|\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 .
z s
modyfikatorem (singleline). Lub [\s\S]*?
obejście.
/\*(.|\n)*?\*/
który wykonał zadanie - dziękuję
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
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>
tagu
W 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.
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 tagami
Zobacz również w dokumentacji JavaScript REGEX dla non-przechwytywanie nawiasach
użyj poniższego wzorca, aby uzyskać zawartość między elementem. Zastąp [tag]
rzeczywisty element, z którego chcesz wyodrębnić zawartość.
<[tag]>(.+?)</[tag]>
Czasami tagi będą miały atrybuty, takie jak anchor
posiadanie tagu href
, a następnie użyj poniższego wzorca.
<[tag][^>]*>(.+?)</[tag]>
<[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>)(.*?)(?=</pre>)
(?<=<pre>)
szuka tekstu po <pre>
(?=</pre>)
szuka tekstu wcześniej </pre>
Wyniki będą zawierać tekst wewnątrz pre
tagu
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:
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
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:
$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();
A ponieważ jest to właściwy parser, będzie w stanie obsłużyć tagi zagnieżdżania itp.
php
. Nie jestem pewien, jak pojawił się PHP ...
Spróbuj tego....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
Wydaje się, że jest to najprostsze wyrażenie regularne ze wszystkich, jakie znalazłem
(?:<TAG>)([\s\S]*)(?:<\/TAG>)
(?:<TAG>)
z dopasowań([\s\S]*)
w dopasowaniach wszelkie znaki spacji lub inne niż białe znaki(?:<\/TAG>)
z dopasowań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.
<table>
<tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr>
<tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6</td></tr>
</table>
To gra składająca się z trzech części: spojrzenia za siebie, treści i spojrzenia w przyszłość.
(?<=>) # look behind (but don't consume/capture) for a '>'
([\w\s]+) # capture/consume any combination of alpha/numeric/whitespace
(?=<\/) # look ahead (but don't consume/capture) for a '</'
Mam nadzieję, że będzie to początek dla 10. Szczęścia.
var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); });
Ponieważ zaakceptowana odpowiedź jest bez kodu javascript, więc dodaj, że:
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.
W Pythonie ustawienie DOTALL
flagi przechwyci wszystko, w tym znaki nowej linii.
Jeśli określono flagę DOTALL, pasuje ona do dowolnego znaku, w tym do nowej linii. docs.python.org
#example.py using Python 3.7.4
import re
str="""Everything is awesome! <pre>Hello,
World!
</pre>
"""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
pattern = re.compile(r"<pre>(.*)</pre>",re.DOTALL)
matches = pattern.search(str)
print(matches.group(1))
python example.py
Hello,
World!
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 .
#example2.py using Python 3.7.4
import re
# str contains three <pre>...</pre> tags
str = """In two different ex-
periments, the authors had subjects chat and solve the <pre>Desert Survival Problem</pre> with a
humorous or non-humorous computer. In both experiments the computer made pre-
programmed comments, but in study 1 subjects were led to believe they were interact-
ing with another person. In the <pre>humor conditions</pre> subjects received a number of funny
comments, for instance: “The mirror is probably too small to be used as a signaling
device to alert rescue teams to your location. Rank it lower. (On the other hand, it
offers <pre>endless opportunity for self-reflection</pre>)”."""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
# The question mark in (.*?) indicates non greedy matching.
pattern = re.compile(r"<pre>(.*?)</pre>",re.DOTALL)
matches = pattern.finditer(str)
for i,match in enumerate(matches):
print(f"tag {i}: ",match.group(1))
python example2.py
tag 0: Desert Survival Problem
tag 1: humor conditions
tag 2: endless opportunity for self-reflection
Możesz użyć Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
<pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>