Регулярное выделить весь текст между тегами

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

13 ответов


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

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


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

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

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

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

это:

(?<=(<pre>)) выбор нужно писать <pre> tag

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

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

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

enter image description here

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

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

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

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

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

также Посмотри ДОКУМЕНТАЦИЯ ПО РЕГУЛЯРНОМУ ВЫРАЖЕНИЮ JAVASCRIPT на незахватывающие скобки


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

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

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

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

вы не должны пытаться анализировать html с помощью regexes see этот вопрос и как это получилось.

проще говоря, html не является регулярным языком, поэтому вы не можете полностью анализировать регулярные выражения.

сказав, что вы можете анализировать подмножества html, когда нет подобных вложенных тегов. Так что, пока что-то между и не является самим тегом, это будет работать:

preg_match("/<([\w]+)[^>]*>(.*?)<\/>/", $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();

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


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

(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_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, поэтому добавив, что:


чтобы исключить обрамляющих тегов:

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

на несколько строк:

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

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


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

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

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

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

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