Как лучше всего выделить весь текст между двумя тегами - например, текст между всеми предварительными тегами на странице.
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Как лучше всего выделить весь текст между двумя тегами - например, текст между всеми предварительными тегами на странице.
/<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)*?
для соответствия любому символу. Всегда используйте модификатор .
with s
(однострочный). Или [\s\S]*?
обходной путь.
/\*(.|\n)*?\*/
что выполнило свою работу - спасибо
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
В основном, что он делает:
(?<=(<pre>))
Выбор должен быть предварен <pre>
тегом
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Это просто регулярное выражение, которое я хочу применить. В этом случае он выбирает букву, цифру или символ новой строки или некоторые специальные символы, перечисленные в примере в квадратных скобках. Символ вертикальной черты |
означает просто « ИЛИ ».
+?
Состояния плюса для выбора одного или нескольких из вышеперечисленных - порядок не имеет значения. Знак вопроса изменяет поведение по умолчанию с «жадного» на «не жадное».
(?=(</pre>))
Выделение должно быть добавлено </pre>
тегом
В зависимости от вашего варианта использования вам может потребоваться добавить некоторые модификаторы, такие как ( i или m )
Здесь я выполнил этот поиск в Sublime Text, поэтому мне не пришлось использовать модификаторы в моем регулярном выражении.
Приведенный выше пример должен нормально работать с такими языками, как 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. Удачи.
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
флага захватит все, включая символы новой строки.
Если был указан флаг DOTALL, он соответствует любому символу, включая новую строку. 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
Это полезно для захвата текста между всеми открывающими и закрывающими тегами в документе . В приведенном ниже примере <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'/>]" );
<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>