【问题标题】:preg_match_all how to remove img tag?preg_match_all 如何删除 img 标签?
【发布时间】:2011-06-21 13:35:23
【问题描述】:
$str=<<<EOT
<img src="./img/upload_20571053.jpg" /><span>some word</span><div>some comtent</div>
EOT;

如何用preg_match_all或其他方式去除img标签?谢谢。

我想要 echo &lt;span&gt;some word&lt;/span&gt;&lt;div&gt;some comtent&lt;/div&gt; // 可能是其他 html 标签,比如在 $str 中,只需删除 img。

【问题讨论】:

  • 您不应该使用黑名单(删除禁止),而是使用白名单(仅保留允许)。请改用适当的 HTML sanitizer。
  • @Jeroen Offerijns:不好的建议。请参阅我对Karo96’s answer 的评论。
  • 嗯,它似乎是重复的,因为它具有相同的接受答案..

标签: php preg-match-all


【解决方案1】:

正如许多人所说,您不应该使用正则表达式来执行此操作。您看到的大多数替换图像标签的示例都是幼稚的,并且不会在所有情况下都有效。考虑到所有内容的正则表达式(假设您首先具有格式良好的 XHTML)将非常长、非常复杂并且以后很难理解或编辑。即使您认为它可以正常工作,也很可能不会。您真的应该使用专门用于解析 (X)HTML 的解析器。

下面是如何使用 PHP 的 DOM 扩展在不使用正则表达式的情况下正确执行此操作:

// add a root node to the XHTML and load it
$doc = new DOMDocument;
$doc->loadXML('<root>'.$str.'</root>');
// create a xpath query to find and delete all img elements
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//img') as $node) {
        $node->parentNode->removeChild($node);
}
// save the result
$str = $doc->saveXML($doc->documentElement);
// remove the root node
$str = substr($str, strlen('<root>'), -strlen('</root>'));

【讨论】:

    【解决方案2】:
    $str = preg_replace('#<img[^>]*>#i', '', $str);
    

    【讨论】:

      【解决方案3】:
      preg_replace("#\<img src\=\"(.+)\"(.+)\/\>#iU", NULL, $str);
      echo $str;
      

      ?

      【讨论】:

      • 你为什么要逃避&lt;="/&gt;
      • &lt;img&lt;img src="" /&gt; src="foo" /&gt; 这样的东西怎么样?
      【解决方案4】:

      除了@Karo96,我会更广泛:

      /<img[^>]*>/i
      

      还有:

      $re = '/<img[^>]*>/i';
      $str = preg_replace($re,'',$str);
      

      demo

      这也假设 html 将被正确格式化。此外,这无视我们应该使用正则表达式解析 html 的一般规则,但为了回答您,我将其包括在内。

      【讨论】:

        【解决方案5】:

        也许你想要preg_replace。那么它将是:$str = preg_replace('#&lt;img.+?&gt;#is', '', $str),尽管应该注意,对于任何重要的 HTML 处理,您必须使用 XML 解析器,例如使用 DOMDocument

        【讨论】:

          【解决方案6】:
          $noimg = preg_replace('/<img[^>]*>/','',$str);
          

          应该做的伎俩。

          【讨论】:

            【解决方案7】:

            不要为此使用正则表达式。时期。这不完全是解析,它可能是微不足道的,但 rexeg 不是为 DOM 制作的:

            RegEx match open tags except XHTML self-contained tags

            以 DomDocument 为例。

            【讨论】:

            • 我不明白怎么会有人反对我的回答。 Downvoter,你完全错了:)
            猜你喜欢
            • 2018-11-25
            • 2014-08-31
            • 2023-03-12
            • 1970-01-01
            • 2019-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多