Подтвердить что ты не робот

Regex выбирает весь текст между тегами

Каков наилучший способ выбора всего текста между двумя тегами - например: текст между всеми тегами "pre" на странице.

4b9b3361

Ответ 1

Вы можете использовать "<pre>(.*?)</pre>", (заменяя pre на любой текст, который вы хотите) и извлекаете первую группу (для более конкретных инструкций указывается язык), но это предполагает упрощенное представление о том, что у вас очень простой и допустимый HTML.

Как и другие комментаторы, если вы делаете что-то сложное, используйте парсер HTML.

Ответ 2

Тег может быть завершен в другой строке. Вот почему \n необходимо добавить.

<PRE>(.|\n)*?<\/PRE>

Ответ 3

Это то, что я бы использовал.

(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|'~]| )+?(?=(</pre>))

В основном то, что он делает:

(?<=(<pre>)) Выбор должен начинаться с <pre>

(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| ) Это это просто регулярное выражение, которое я хочу применить. В этом случае он выбирает букву, цифру или символ новой строки или некоторые специальные символы, перечисленные в примере в квадратных скобках. Символ | просто означает " ИЛИ ".

+? Плюс символы состояния, чтобы выбрать один или несколько из вышеперечисленных - порядок не имеет значения. Вопросительный знак изменяет поведение по умолчанию с "жадный" на "неряшливый".

(?=(</pre>)) Выбор должен быть добавлен </pre>

enter image description here

В зависимости от вашего варианта использования может потребоваться добавить некоторые модификаторы, такие как (i или m)

  • я - без учета регистра
  • m - многострочный поиск

Здесь я выполнил этот поиск в Sublime Text, поэтому мне не пришлось использовать модификаторы в моем регулярном выражении.

Javascript не поддерживает вид сзади

Приведенный выше пример должен хорошо работать с такими языками, как PHP, Perl, Java... Javascript, однако, не поддерживает lookbehind, поэтому мы должны забыть об использовании (?<=(<pre>)) и искать какой-то обходной путь, Возможно, просто удалите первые четыре символа из нашего результата для каждого выбора, как здесь Regex, сопоставьте текст между тегами

Также обратите внимание на документацию JAVASCRIPT REGEX для не захватывающих скобок.

Ответ 4

используйте шаблон ниже, чтобы получить содержимое между элементами. Замените [tag] фактическим элементом, из которого вы хотите извлечь содержимое.

<[tag]>(.+?)</[tag]>

Иногда теги будут иметь атрибуты, такие как тег anchor имеющий href, затем используйте шаблон ниже.

 <[tag][^>]*>(.+?)</[tag]>

Ответ 5

Вы не должны пытаться разобрать 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();

И так как это правильный синтаксический анализатор, он сможет обрабатывать теги вложенности и т.д.

Ответ 6

Чтобы исключить теги разметки:

"(?<=<pre>)(.*?)(?=</pre>)"

Ответ 7

Это, кажется, самое простое регулярное выражение всего, что я нашел

(?:<TAG>)([\s\S]*)(?:<\/TAG>)
  1. Исключить открывающий тег (?:<TAG>) из совпадений
  2. Включить любые пробельные или небелые символы ([\s\S]*) в матчах
  3. Исключить закрывающий тег (?:<\/TAG>) из совпадений

Ответ 8

Попробуйте это....

(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)

Ответ 9

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); });

Ответ 10

preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches) matches preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches) это регулярное выражение будет выбирать между тэгами. независимо от того, находится ли она в новой строке (работа с многострочной.

Ответ 11

Для нескольких строк:

<htmltag>(.+)((\s)+(.+))+</htmltag>

Ответ 12

Вы можете использовать Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );

Ответ 13

Я использую это решение:

preg_match_all( '/<((?!<)(.|\n))*?\>/si',  $content, $new);
var_dump($new);

Ответ 14

В 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

Ответ 15

<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>