$ 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 */ } }