正则表达式,用于匹配类中包含特定单词并具有特定 ID 的标记


Regexp to match tag that contain specific word in class and has specific id

尝试将标签部分与包含某些特定单词并且还具有id的类(也许是其他一些标签属性)匹配。

<section id="footer-widget-wysija-2" class="widget footer-widget widget_wysija">Some html</section>

希望在呈现之前从 html 中删除此部分。

尝试了很多事情,但没有运气。
任何帮助将不胜感激。
谢谢

处理 HTML 文档的最佳方法是使用解析器。

在这些示例中,我将使用内置DOMDocument

首先,你必须初始化DOMDocument并加载HTML字符串:

$dom = new DOMDocument();
libxml_use_internal_errors( True );
$dom->loadHTML( $html );
libxml_use_internal_errors( False );

我使用 ->loadHTML 加载字符串,但是如果您的原始 HTML 在文件中,您可以直接使用

$dom->loadHTMLFile( $yourFilePath ); 

为避免出现有关无效 HTML 语法的烦人警告,
我设置libxml_use_internal_errors( True ).

示例 1:删除所有带有"section"标签的节点:

$nodes = $dom->getElementsByTagName( 'section' );
while( $nodes->length )
{
    $nodes->item(0)->parentNode->removeChild( $nodes->item(0) );
}

使用->getElementsByTagName( 'section' ),我获取带有标签section的文档的所有节点,然后 - 在while循环中 - 我删除每个节点。请注意,我使用 while 而不是 foreach ,因为(如果我有两个section节点,即)当我删除第一个节点时,第二个节点成为第一个,接下来的foreach循环将失败。作为替代方案,我可以使用递减for循环。

示例 2:按 ID 删除节点:

if( $node = $dom->getElementById( 'footer-widget-wysija-1' ) )
{
    $node->parentNode->removeChild( $node );
}

根据定义,ID 是唯一的,因此->getElementById()只返回一个元素:如果找到它,我可以使用 ->removeChild() 删除它

输出网页:

最后,要输出生成的 HTML,您必须使用

echo $dom->saveHTML();
只要

你没有嵌套的部分:

$html = preg_replace('#<section.+id="footer-widget-wysija-2".+</section>#is', '', $html);