Как получить содержимое из тегов с регулярным выражением? [Дубликат]

Вы можете использовать назначение среза, если исходный список должен быть изменен, но при этом используется эффективное понимание списка (или выражение генератора).

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]
87
задан user990423 11 November 2015 в 20:00
поделиться

14 ответов

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

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

107
ответ дан PyKing 21 August 2018 в 06:03
поделиться
  • 1
    Это не отображает текст между тегами, он включает теги. – capikaw 1 February 2017 в 20:47
  • 2
    – Vishal Kumar Sahu 1 October 2017 в 13:33
  • 3
    нет работы с несколькими линиями – Webserveis 20 December 2017 в 18:10
  • 4
    Для многострочных тегов: & lt; html_tag & gt; (. +) ((\ S) + (. +)) + & Lt; \ / html_tag & gt; – Felipe Augusto 10 April 2018 в 18:42
  • 5
    Это все еще имеет видимость так: если вы все еще видите теги <pre> после попытки <pre>(.*?)<\/pre>, это потому, что вы смотрите на то, что захвачено полным совпадением, вместо группы захвата (. *?). Звучит сыро, но я всегда думаю, что «скобки» - пара воров ». потому что если за ( следует ?, как в (?: или (?>, каждое совпадение будет иметь два захвата: 1 для полного соответствия & amp; 1 для группы захвата. Каждый дополнительный набор скобок добавляет дополнительный захват. Вам просто нужно знать, как извлекать оба захвата на любом языке, с которым вы работаете. – rbsdca 5 May 2018 в 18:11

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

0
ответ дан Ambrish Rajput 21 August 2018 в 06:03
поделиться

Вы не должны пытаться анализировать 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
ответ дан Community 21 August 2018 в 06:03
поделиться
  • 1
    Просто хочу сказать, что я немного обеспокоен тем, что это все еще собирает downvotes, пока это единственный ответ, который поставляет правильное решение рядом с регулярным выражением, и я также добавил достаточное предупреждение о том, что это, вероятно, не самый правильный способ ... По крайней мере, прокомментируйте, что так неправильно в моем ответе, пожалуйста. – sg3s 13 March 2017 в 17:02

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

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

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

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

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

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

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

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

  • i - нечувствительность к регистру
  • m - multi -line search

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

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

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

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

10
ответ дан ctwheels 21 August 2018 в 06:03
поделиться

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

<htmltag>(.+)((\s)+(.+))+</htmltag>
0
ответ дан Dilip 21 August 2018 в 06:03
поделиться

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

(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
3
ответ дан Heriberto Rivera 21 August 2018 в 06:03
поделиться
  • 1
    Обратите внимание: в JavaScript JavaScript не поддерживается. – allicarn 23 September 2016 в 18:59
  • 2
    Конечно, Ooo, но это регулярное выражение для Java. спасибо за ваше примечание. – Heriberto Rivera 1 April 2017 в 20:39

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

"(?<=<pre>)(.*?)(?=</pre>)"
1
ответ дан Jean-Simon Collard 21 August 2018 в 06:03
поделиться

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, поэтому добавление:

1
ответ дан Shishir Arora 21 August 2018 в 06:03
поделиться

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

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

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

 <[tag][^>]*>(.+?)</[tag]>
5
ответ дан Shravan Ramamurthy 21 August 2018 в 06:03
поделиться
  • 1
    Попробуйте первый пример: «& lt; head & gt; (. +?) & Lt; / head & gt; и работает, как ожидалось. Но у меня нет результатов со вторым. – Alex Byrth 26 February 2016 в 14:46
  • 2
    это не работает. <[tag]> будет соответствовать <t>, <a> и <g> – MA-Maddin 14 September 2016 в 08:21
  • 3
    @ MA-Maddin - Я думаю, вы пропустили часть Replace [tag] with the actual element you wish to extract the content from. – LWC 6 July 2018 в 18:50
  • 4
    Хорошо, да. Эти [] должны быть полностью опущены. Это было бы более понятно из-за их значения в RegEx и факта, что люди сначала сканируют код и читают текст после;) – MA-Maddin 6 July 2018 в 21:06

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

preg_match_all( '/<((?!<)(.|\n))*?\>/si',  $content, $new);
var_dump($new);
0
ответ дан T.Todua 21 August 2018 в 06:03
поделиться
<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>
-3
ответ дан user5988518 21 August 2018 в 06:03
поделиться
  • 1
    Пожалуйста, введите / объясните свой ответ, используя слова. – Andrew Regan 27 February 2016 в 00:11

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

<PRE>(.|\n)*?<\/PRE>
94
ответ дан Vikas 21 August 2018 в 06:03
поделиться
0
ответ дан Krishna thakor 1 November 2018 в 01:20
поделиться
0
ответ дан maqduni 1 November 2018 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: