【问题标题】:Strip Tags and everything in between剥离标签和介于两者之间的所有内容
【发布时间】:2010-04-13 14:09:57
【问题描述】:

我怎样才能剥离<h1>including this content</h1>

我知道您可以使用条形标签来删除标签,但我希望两者之间的所有内容都消失。

任何帮助将不胜感激。

【问题讨论】:

    标签: php


    【解决方案1】:

    在处理 HTML 时,您应该使用 HTML 解析器来正确处理它。你可以使用 PHP 的 DOMDocument 并使用 DOMXPath 查询元素,例如:

    $doc = new DOMDocument();
    $doc->loadHTML($html);
    $xpath = new DOMXPath($doc);
    foreach ($xpath->query('//h1') as $node) {
        $node->parentNode->removeChild($node);
    }
    $html = $doc->saveHTML();
    

    【讨论】:

    • +1 在此处使用解析器。一次做对,当您(或其他开发人员,或使用 WYSIYWG 编辑器的客户)使正则表达式无效时,无需重新访问。
    • 这看起来是一个很好的解决方案,但是我只想包含列表 h1 而不是实际的页面 h1,如果这有意义的话。虽然谢谢你,但我已经注意到这个用于其他用途。
    • @Andy 只需将 xPath 选择器更改为仅匹配包含元素内的 h1。
    • +1 做得很好。但是,我可以添加多个标签搜索吗? $xpath->query('//h1//script//div') 之类的东西?
    • 由于 5.5 年没有人回复@asprin,我想我会的。要查询多个标签,只需使用您熟悉的 OR 运算符即可。这意味着您的代码将类似于 $xpath->query('//h1|//script|//div')
    【解决方案2】:

    试试这个:

    preg_replace('/<h1[^>]*>([\s\S]*?)<\/h1[^>]*>/', '', '<h1>including this content</h1>');
    

    示例:

    echo preg_replace('/<h1[^>]*>([\s\S]*?)<\/h1[^>]*>/', '', 'Hello<h1>including this content</h1> There !!');
    

    输出:

    Hello There
    

    【讨论】:

    • HTML 允许在属性值中使用纯 &gt;。
    【解决方案3】:

    如果您想去除所有标签并包括内容:

    $yourString = 'Hello <div>Planet</div> Earth. This is some <span class="foo">sample</span> content!';
    $regex = '/<[^>]*>[^<]*<[^>]*>/';
    echo preg_replace($regex, '', $yourString);
    #=> Hello  Earth. This is some  content!
    

    HTML 属性可以包含&lt; 或&gt;。因此,如果您的 HTML 变得过于混乱,此方法将不起作用,您将需要一个 DOM 解析器。


    正则表达式解释

    NODE                     EXPLANATION
    --------------------------------------------------------------------------------
      <                        '<'
    --------------------------------------------------------------------------------
      [^>]*                    any character except: '>' (0 or more times
                               (matching the most amount possible))
    --------------------------------------------------------------------------------
      >                        '>'
    --------------------------------------------------------------------------------
      [^<]*                    any character except: '<' (0 or more times
                               (matching the most amount possible))
    --------------------------------------------------------------------------------
      <                        '<'
    --------------------------------------------------------------------------------
      [^>]*                    any character except: '>' (0 or more times
                               (matching the most amount possible))
    --------------------------------------------------------------------------------
      >                        '>'
    

    【讨论】:

    • HTML 允许在属性值中使用纯 &gt;。
    • Gumbo,你打败了我。我只是在做一个修改:)
    • 考虑到所有 HTML 都在根节点内,这不会让您没有任何内容吗?
    • 这对我有用,我喜欢代码的简洁性。
    【解决方案4】:

    您可以使用 XSLT 样式表并将所有标签与它们自己匹配,除了 h1 标签,它会与空字符串匹配,然后将其应用于您的文档。不过做这么简单的事情可能有点太重了。

    【讨论】:

      【解决方案5】:

      您还可以使用 strip_tags 删除标签以及介于两者之间的所有内容..

      $html 包含您要从中删除标签的 html 或 php。

      strip_tags($html,"");

      试试这个,我认为这对你有用。

      【讨论】:

        猜你喜欢
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 2016-11-06
        • 2017-04-23
        • 2014-07-08
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多