как удалить тег и его содержимое с помощью регулярного выражения?

$ str = 'некоторые текстовые теги содержат больше текста';

Мои вопросы: Как получить tag <em>contents </em> контента tag <em>contents </em> который находится между <MY_TAG> .. </MY_TAG> ?

А также

Как удалить <MY_TAG> и его содержимое из $str ?

Я использую PHP.

Спасибо.

Если MY_TAG не может быть вложенным, попробуйте это, чтобы получить совпадения:

 preg_match_all('/<MY_TAG>(.*?)<\/MY_TAG>/s', $str, $matches) 

Чтобы удалить их, вместо этого используйте preg_replace .

Для удаления я просто использовал это:

 $str = preg_replace('~<MY_TAG(.*?)</MY_TAG>~Usi', "", $str); 

Использование ~ вместо / для устранения разграниченных ошибок, возникающих из-за обратной косой черты в конце тега, которая, казалось, была проблемой даже при экранировании. Устранение> из тега открытия допускает атрибуты или другие символы и по-прежнему получает тег и все его содержимое.

Это работает только там, где гнездование не вызывает беспокойства.

Модификаторы Usi означают U = Ungreedy, s = включают символы линии, i = регистр нечувствителен.

Хотя единственный правильный способ сделать это – не использовать регулярные выражения, вы можете получить то, что хотите, если вы примете его, он не будет обрабатывать все особые случаи:

 preg_match("/<em[^>]*?>.*?</em>/i", $str, $match); // Use this only if you aren't worried about nested tags. // It will handle tags with attributes 

А также

 preg_replace(""/<MY_TAG[^>]*?>.*?</MY_TAG>/i", "", $str); 

Вы не хотите использовать для этого регулярные выражения. Лучшим решением было бы загрузить ваше содержимое в DOMDocument и работать с ним с использованием дерева DOM и стандартных методов DOM:

 $document = new DOMDocument(); $document->loadXML('<root/>'); $document->documentElement->appendChild( $document->createFragment($myTextWithTags)); $MY_TAGs = $document->getElementsByTagName('MY_TAG'); foreach($MY_TAGs as $MY_TAG) { $xmlContent = $document->saveXML($MY_TAG); /* work on $xmlContent here */ /* as a further example: */ $ems = $MY_TAG->getElementsByTagName('em'); foreach($ems as $em) { $emphazisedText = $em->nodeValue; /* do your operations here */ } }