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


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

13 86

13 ответов:

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

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

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

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

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

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

это:

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

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

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

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

enter image description here

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

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

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

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

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

также Посмотри JAVASCRIPT REGEX DOCUMENTATION на незахватывающие скобки

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

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

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

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

вы не должны пытаться парсить HTML с помощью регулярных выражений см. этот вопрос и как это получилось.

в самых простых терминах 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>