2010-03-04 3 views
7

$ str = 'некоторый текстовый тег содержание другой текст';Как удалить тег и его содержимое с помощью регулярного выражения?

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

И

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

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

спасибо.

+3

Интересно, сколько раз следующий ответ был связан в любой день: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454# 1732454 – Nicole

+0

HTML-парсер бла-бла-бла ... Вы знаете упражнение. –

ответ

11

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

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

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

+0

hii .. whats/s для ?? спасибо за ответ – user187580

+0

@ user187580: Флаг * s * нарушает разрыв строки '.'. См. Http://php.net/manual/en/reference.pcre.pattern.modifiers.php – Gumbo

+0

. Если вы можете найти этот тег в строке более одного раза, вы должны установить неровный этот шаблон. В противном случае вы обнаружите, что вы преобразовать эту строку «Это очень важно установить линию» в «Это строка» – Don

2

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

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); 
2

Вы не хотите использовать для этого регулярные выражения. Гораздо лучше было бы загружать содержимое в 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 */ 
    } 
} 
4

Для удаления я в конечном итоге только с помощью этого:

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

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

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

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

+0

хорошая работа (y) отлично работает для диапазона e.g $ ptitle = preg_replace ('~ ~ Usi', "", $ ptitleWithSpan); –

Смежные вопросы