Вы можете использовать назначение среза, если исходный список должен быть изменен, но при этом используется эффективное понимание списка (или выражение генератора).
>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]
Вы можете использовать "<pre>(.*?)</pre>"
, (заменяя pre на любой текст, который вы хотите) и извлекаете первую группу (для более конкретных инструкций указывается язык), но это предполагает упрощенное представление о том, что у вас очень простой и допустимый HTML.
Как и другие комментаторы, если вы делаете что-то сложное, используйте парсер HTML.
Вы можете использовать Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
Вы не должны пытаться анализировать 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();
И так как это правильный парсер, он сможет обрабатывать теги вложенности и т. д.
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
В основном, что он делает:
(?<=(<pre>))
Выбор должен быть добавлен с тегом <pre>
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Это просто регулярное выражение, которое я хочу применить. В этом случае он выбирает символ буквы или цифры или символ новой строки или некоторые специальные символы, перечисленные в примере в квадратных скобках. Символ трубы |
просто означает «ИЛИ».
+?
Плюс символьные состояния для выбора одного или нескольких из вышеуказанного порядка не имеют значения. Вопросительный знак изменяет поведение по умолчанию от «жадного» до «неровного».
(?=(</pre>))
Выбор должен быть добавлен тегом <pre>
В зависимости от вашего варианта использования вам может потребоваться добавить некоторые модификаторы, такие как (i или m)
Здесь я выполнил этот поиск в Sublime Text, поэтому мне не пришлось использовать модификаторы в моем регулярном выражении.
Вышеприведенный пример должен отлично работать с такими языками, как PHP, Perl, Java ... Javascript, однако, не поддерживает lookbehind, поэтому мы должны забыть об использовании (?<=(<pre>))
и искать какое-то обходное решение. Возможно, просто нарисуйте первые четыре символа из нашего результата для каждого выбора, например, здесь Текст, соответствующий регулярному выражению между тегами
Также посмотрите на JAVASCRIPT REGEX DOCUMENTATION для не захватывающие круглые скобки
Для нескольких строк:
<htmltag>(.+)((\s)+(.+))+</htmltag>
Попробуйте это ....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
Чтобы исключить теги разметки:
"(?<=<pre>)(.*?)(?=</pre>)"
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, поэтому добавление:
используйте шаблон ниже, чтобы получить контент между элементами. Замените [тег] на фактический элемент, из которого вы хотите извлечь содержимое.
<[tag]>(.+?)</[tag]>
Иногда теги будут иметь атрибуты, такие как тэг anchor
, имеющий href
, а затем использовать шаблон ниже.
<[tag][^>]*>(.+?)</[tag]>
Replace [tag] with the actual element you wish to extract the content from
.
– LWC
6 July 2018 в 18:50
[]
должны быть полностью опущены. Это было бы более понятно из-за их значения в RegEx и факта, что люди сначала сканируют код и читают текст после;)
– MA-Maddin
6 July 2018 в 21:06
Я использую это решение:
preg_match_all( '/<((?!<)(.|\n))*?\>/si', $content, $new);
var_dump($new);
<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>
Тег может быть завершен в другой строке. Вот почему \n
необходимо добавить.
<PRE>(.|\n)*?<\/PRE>
<pre>
после попытки<pre>(.*?)<\/pre>
, это потому, что вы смотрите на то, что захвачено полным совпадением, вместо группы захвата (. *?). Звучит сыро, но я всегда думаю, что «скобки» - пара воров ». потому что если за(
следует?
, как в(?:
или(?>
, каждое совпадение будет иметь два захвата: 1 для полного соответствия & amp; 1 для группы захвата. Каждый дополнительный набор скобок добавляет дополнительный захват. Вам просто нужно знать, как извлекать оба захвата на любом языке, с которым вы работаете. – rbsdca 5 May 2018 в 18:11