Как лучше всего выделить весь текст между двумя тегами - например, текст между всеми предварительными тегами на странице.
html
regex
html-parsing
Башепс
источник
источник
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Ответы:
Вы можете использовать
"<pre>(.*?)</pre>"
(заменив pre любым текстом, который хотите) и извлечь первую группу (для более конкретных инструкций укажите язык), но это предполагает упрощенное представление о том, что у вас очень простой и действительный HTML.Как предлагали другие комментаторы, если вы делаете что-то сложное, используйте парсер HTML.
источник
<pre>
теги после попытки<pre>(.*?)<\/pre>
, это потому, что вы смотрите на то, что было захвачено с помощью полного совпадения, а не группы захвата (. *?). Звучит банально, но я всегда думаю, что «скобка = пара воров», потому что, если за символом не(
следует «?
как в»(?:
или(?>
, каждое совпадение будет иметь два захвата: 1 для полного соответствия и 1 для группы захвата. Каждый дополнительный набор скобок добавляет дополнительный захват. Вам просто нужно знать, как получить оба захвата на любом языке, с которым вы работаете.Тег можно заполнить другой строкой. Вот почему
\n
нужно добавить.<PRE>(.|\n)*?<\/PRE>
источник
(.|\n)*?
при работе с HTML-тегами в несколько строк. Выбранный ответ работает, только если HTML-теги находятся в одной строке.(.|\n)*?
для соответствия любому символу. Всегда используйте модификатор.
withs
(однострочный). Или[\s\S]*?
обходной путь./\*(.|\n)*?\*/
что выполнило свою работу - спасибоЭто то, что я бы использовал.
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
В основном, что он делает:
(?<=(<pre>))
Выбор должен быть предварен<pre>
тегом(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Это просто регулярное выражение, которое я хочу применить. В этом случае он выбирает букву, цифру или символ новой строки или некоторые специальные символы, перечисленные в примере в квадратных скобках. Символ вертикальной черты|
означает просто « ИЛИ ».+?
Состояния плюса для выбора одного или нескольких из вышеперечисленных - порядок не имеет значения. Знак вопроса изменяет поведение по умолчанию с «жадного» на «не жадное».(?=(</pre>))
Выделение должно быть добавлено</pre>
тегомВ зависимости от вашего варианта использования вам может потребоваться добавить некоторые модификаторы, такие как ( i или m )
Здесь я выполнил этот поиск в Sublime Text, поэтому мне не пришлось использовать модификаторы в моем регулярном выражении.
Javascript не поддерживает поиск назад
Приведенный выше пример должен нормально работать с такими языками, как PHP, Perl, Java ... Javascript, однако, не поддерживает ретроспективный просмотр, поэтому мы должны забыть об использовании
(?<=(<pre>))
и искать какое-то обходное решение. Возможно, просто удалите первые четыре символа из нашего результата для каждого выбора, как здесь, текст соответствия Regex между тегамиТакже посмотрите ДОКУМЕНТАЦИЮ JAVASCRIPT REGEX, чтобы узнать о скобках без захвата.
источник
используйте шаблон ниже, чтобы получить содержимое между элементами. Замените
[tag]
фактическим элементом, из которого вы хотите извлечь содержимое.<[tag]>(.+?)</[tag]>
Иногда теги будут иметь атрибуты, например,
anchor
тегиhref
, тогда используйте шаблон ниже.<[tag][^>]*>(.+?)</[tag]>
источник
<[tag]>
будет соответствовать<t>
,<a>
и<g>
Replace [tag] with the actual element you wish to extract the content from
роль.[]
следовало вообще опустить. Это было бы более понятно из-за их значения в RegEx и того факта, что люди сначала сканируют код, а затем читают текст;)Чтобы исключить теги-разделители:
(?<=<pre>)(.*?)(?=</pre>)
(?<=<pre>)
ищет текст после<pre>
(?=</pre>)
ищет текст перед</pre>
Результаты будут отображаться внутри
pre
тегаисточник
Вы не должны пытаться анализировать html с помощью регулярных выражений, посмотрите этот вопрос и как это получилось.
Проще говоря, html не является обычным языком, поэтому вы не можете полностью проанализировать его с помощью регулярных выражений.
Сказав, что вы можете анализировать подмножества html, когда нет вложенных похожих тегов. Итак, если что-то между и не является самим тегом, это будет работать:
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches); $matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
Лучше использовать парсер, такой как собственный DOMDocument, для загрузки вашего html, затем выбрать свой тег и получить внутренний html, который может выглядеть примерно так:
$obj = new DOMDocument(); $obj -> load($html); $obj -> getElementByTagName('el'); $value = $obj -> nodeValue();
И поскольку это правильный парсер, он сможет обрабатывать теги вложенности и т. Д.
источник
php
. Не знаю, как PHP появился на свет ...Попробуй это....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
источник
Этот ответ предполагает поддержку осмотрительности! Это позволило мне идентифицировать весь текст между парами открывающих и закрывающих тегов. Это весь текст между '>' и '<'. Это работает, потому что при осмотре не используются совпадающие символы.
(? <=>) ([\ w \ s] +) (? = </)
Я протестировал его на https://regex101.com/, используя этот фрагмент 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>
Это игра из трех частей: взгляд назад, содержание и взгляд вперед.
(?<=>) # 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 '</'
Надеюсь, это послужит началом для 10. Удачи.
источник
Кажется, это самое простое регулярное выражение из всех, что я нашел
(?:<TAG>)([\s\S]*)(?:<\/TAG>)
(?:<TAG>)
из совпадений([\s\S]*)
в совпадения любые пробельные или непробельные символы(?:<\/TAG>)
из совпаденийисточник
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); });
Поскольку принятый ответ не содержит кода javascript, поэтому добавляем следующее:
источник
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
это регулярное выражение будет выбирать все между тегами. независимо от того, находится ли он в новой строке (работа с multiline.источник
В Python установка
DOTALL
флага захватит все, включая символы новой строки.#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
Это полезно для захвата текста между всеми открывающими и закрывающими тегами в документе . В приведенном ниже примере<pre>
в строке присутствуют три открывающих и закрывающих тега.#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
источник
Ты можешь использовать
Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
источник
Я использую это решение:
preg_match_all( '/<((?!<)(.|\n))*?\>/si', $content, $new); var_dump($new);
источник
Для нескольких строк:
источник
В Javascript (среди прочего) это просто. Он охватывает атрибуты и несколько строк:
/<pre[^>]*>([\s\S]*?)<\/pre>/
источник
<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>
источник