Удалите ненужные теги с тегом regex

Я ищу регулярное выражение, которое удаляет теги и все, пока не найдет открытый тег. Например:

</xy>..</zz>..<a>... -> <a>...

</b>..</cc>..<a href="#">...</a> -> <a href="#">...</a>

Я попробовал это, но по какой-то причине не работает:

 $html = preg_replace("/^.*<.*>/","<.*>",$html); 

Solutions Collecting From Web of "Удалите ненужные теги с тегом regex"

Ниже 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 

Это все, начиная от и включая первый открытый тег.