如何使用正则表达式删除标记及其内容?

时间:2010-03-04 18:19:50

标签: php regex

$ str ='某些文字标记内容更多文字';

我的问题是: 如何检索tag <em>contents </em>之间的内容<MY_TAG> .. </MY_TAG>

如何从<MY_TAG>删除$str及其内容?

我正在使用PHP。

谢谢。

5 个答案:

答案 0 :(得分:11)

如果MY_TAG无法嵌套,请尝试以获取匹配项:

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

要删除它们,请改用preg_replace

答案 1 :(得分:7)

为了删除,我最终只使用了这个:

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

使用〜而不是/为分隔符解决了由于结束标记中的反斜杠引发的错误,即使转义也似乎是一个问题。消除&gt;从开始标记允许属性或其他字符,仍然获取标记及其所有内容。

这仅适用于嵌套不是问题的地方。

Usi修饰符表示U = Ungreedy,s =包含换行符,i =不区分大小写。

答案 2 :(得分: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 */
    }
}

答案 3 :(得分:1)

虽然唯一完全正确的方法是不使用正则表达式,但是如果你接受它就可以得到你想要的东西:

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

答案 4 :(得分:1)

我测试了这个功能,它也适用于嵌套标签,使用 true/false 排除/包含您的标签。在这里找到:https://www.php.net/manual/en/function.strip-tags.php

<?php
function strip_tags_content($text, $tags = '', $invert = FALSE) {

  preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags);
  $tags = array_unique($tags[1]);
   
  if(is_array($tags) AND count($tags) > 0) {
    if($invert == FALSE) {
      return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text);
    }
    else {
      return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text);
    }
  }
  elseif($invert == FALSE) {
    return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
  }
  return $text;
}




// Sample text:
$text = '<b>sample</b> text with <div>tags</div>';

// Result for:
echo strip_tags_content($text);
// text with

// Result for:
echo strip_tags_content($text, '<b>');
// <b>sample</b> text with

// Result for:
echo strip_tags_content($text, '<b>', TRUE);
// text with <div>tags</div>