Регулярное выражение выделить весь текст между тегами
каков наилучший способ выбрать весь текст между 2 тегами-например: текст между всеми тегами " pre " на странице.
13 ответов:
можно использовать
"<pre>(.*?)</pre>"
, (заменяя pre любым текстом, который вы хотите) и извлеките первую группу (для более конкретных инструкций укажите язык), но это предполагает упрощенное понятие, что у вас очень простой и действительный HTML.Как предложили другие комментаторы, если вы делаете что-то сложное, используйте парсер HTML.
это то, что я хотел бы использовать.
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
это:
(?<=(<pre>))
выбор должен быть дополнен<pre>
tag
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Это просто регулярное выражение, которое я хочу применить. В этом случае он выбирает букву или цифру или символ новой строки или некоторые специальные символы, перечисленные в Примере в квадратных скобках. Символ|
просто значит "или".
+?
плюс состояния символов для выбора одного или нескольких из вышеперечисленных порядков не имеет значения. вопрос изменяет поведение по умолчанию с "жадный" на "нескладный".
(?=(</pre>))
выбор должен быть добавлен к<pre>
tagв зависимости от вашего варианта использования может потребоваться добавить некоторые модификаторы как (я или 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();
и поскольку это правильный парсер, он сможет обрабатывать теги вложенности и т. д.
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( '/<((?!<)(.|\n))*?\>/si', $content, $new); var_dump($new);