Я ищу регулярное выражение, которое удаляет теги и все, пока не найдет открытый тег. Например:
</xy>..</zz>..<a>...
-> <a>...
</b>..</cc>..<a href="#">...</a>
-> <a href="#">...</a>
Я попробовал это, но по какой-то причине не работает:
$html = preg_replace("/^.*<.*>/","<.*>",$html);
Ниже regex будет захватывать и сохранять весь текст перед открывающим тегом в группу ( group1
), а также захватывать и хранить оставшиеся строки в другой группе. Таким образом, вторая группа содержит текст из открывающего тега.
(.*)(<\w.*)
DEMO
Ваш php-код будет,
<?php $re = '~(.*)(<\w.*)~'; $str= '</b>..</cc>..<a href="#">...</a> -> <a href="#">...</a>'; $replacement = "$2"; echo preg_replace($re, $replacement, $str); ?> //=> <a href="#">...</a>
ИЛИ
<?php $re = '~(?:.*)(<\w.*)~'; $str= '</p>\n<p>Â </p>'; $replacement = "$1"; echo preg_replace($re, $replacement, $str); ?>
Объяснение:
(.*)(<\w.*)
захватывает с начала строки и останавливает захват, когда находит <
folllowed by \w
word character. Строки до <\w
хранятся внутри группы 1, а строки после <\w
хранятся внутри группы2 (включая <\w
). Если я правильно понимаю ваши ответы на ответ Авинаша Раджа, вам нужно что-то, что соответствует любому количеству строк ввода до первого открытого тега, но это соответствует только одному, чтобы все последующее содержимое поддерживалось.
.*(\n.*?)*?(<\w.*(\n.*)*)
Первая часть
.*(\n.*?)*?
Соответствует любому количеству строк, но не жадно (следовательно,? S), поэтому он останавливается в первой строке, содержащей открытый тег:
<\w
Затем это снова повторяется любым количеством строк:
.*(\n.*)*
Итак, чтобы извлечь то, что вы хотите, вы замените
.*(\n.*?)*?(<\w.*(\n.*)*)
С
\2
Это все, начиная от и включая первый открытый тег.