【问题标题】:PHP Regex completely remove HTML Anchor link from string in PHPPHP Regex 从 PHP 中的字符串中完全删除 HTML Anchor 链接
【发布时间】:2016-09-24 06:40:58
【问题描述】:

我在 PHP 中有一个 HTML 字符串。它可能有几个这样的锚标签

.....<p><span>qwerty</span></p>...qwerty....<a href="www.xyz.com">xyz</a>qwerty...<a href="www.xyz.com"><p><span>xyz</span></p></a>qwerty.....

&lt;a&gt; 标签可能包含其他几个 HTML 标签,如 &lt;p&gt;,&lt;span&gt; &lt;br&gt; 等。

我想要一个正则表达式,它删除 &lt;a&gt; 标签内的所有内容,包括 &lt;a&gt; 标签,即删除所有锚标签以及锚标签内的所有数据

输出应该是:&lt;p&gt;&lt;span&gt;qwerty&lt;/span&gt;&lt;/p&gt;....qwerty....qwerty....qwerty....

请注意,最终输出中没有 xyz。

谢谢

P/s:字符串可能包含其他未嵌入 Anchor 标签的 HTML 标签。我想保留它们。假设字符串可能包含 p、span、div、strong 等标签。只应删除一个标签。我需要正则表达式。

【问题讨论】:

    标签: php html regex


    【解决方案1】:

    您不需要任何正则表达式,只需使用 strip_tags function 从输入中去除 HTML 标签:

    $s = '.....qwerty....<a href="www.xyz.com">xyz</a>qwerty...<a href="www.xyz.com"><p><span>xyz</span></p></a>qwerty.....';
    
    echo strip_tags($s);
    
    //=> .....qwerty....xyzqwerty...xyzqwerty.....
    

    基于edited问题:您可以将一些标签列入白名单以允许它们输入:

    $s = '.....<p><span>qwerty</span></p>...qwerty....<a href="www.xyz.com">xyz</a>qwerty...<a href="www.xyz.com"><p><span>xyz</span></p></a>qwerty.....';
    
    echo strip_tags($s, '<p><span>');
    //=> .....<p><span>qwerty</span></p>...qwerty....xyzqwerty...<p><span>xyz</span></p>qwerty.....
    

    使用正则表达式进行 HTML 解析的所有缺陷都可以在 OP 中使用:

    echo preg_replace('~<a [^>]*>.*?</a>~', '', $s);
    //=> .....<p><span>qwerty</span></p>...qwerty....qwerty...qwerty.....
    

    【讨论】:

    • 其实我无法解释。字符串可能包含其他未嵌入 Anchor 标签的 HTML 标签。我想保留它们。所以你的解决方案也会删除它们。
    • 是的,您可以在strip_tags 中允许某些标签。在我的回答中查看strip_tags 文档的链接。
    • 没有。它不是这样的。我们可以允许所有其他 HTML 标记(可能除了锚标记之外的所有标记)。我们只想删除 Anchor 标签。
    • 使用正则表达式解析 HTML 很容易出错。首选 DOM 解析器以获得更好的控制。
    【解决方案2】:

    您可以使用DOMDocument 而不是正则表达式来实现所需的结果

    function removeanchors( $strhtml ){
        $dom=new DOMDocument;
        $dom->loadHTML( $strhtml );
        $col=$dom->getElementsByTagName('a');
    
        /* need to work backwards through collection of nodes! */
        for ( $i = $col->length; --$i >= 0; ) {
          $a = $col->item( $i );
          $a->parentNode->removeChild( $a );
        }
    
        return $dom->saveHTML();
    }
    
    $strhtml='.....qwerty....<a href="www.xyz.com">xyz</a>qwerty...<a href="www.xyz.com"><p><span>xyz</span></p></a>qwerty.....womble<a href="www.xyz.com"><p><span>xyz</span></p></a> ..... badger <a href="www.xyz.com"><p><span>xyz</span></p></a>';
    
    echo removeanchors( $strhtml );
    

    【讨论】:

      猜你喜欢
      • 2013-06-03
      • 1970-01-01
      • 2013-02-24
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多