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

时间:2016-02-19 14:32:28

标签: php regex

尝试将标记部分与一个类匹配,该类包含一些特定单词并且还具有id,也许还有其他一些标记属性。

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

想要在渲染之前从html中删除此部分。

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

2 个答案:

答案 0 :(得分:0)

只要您没有嵌套部分:

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

答案 1 :(得分:0)

使用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节点,即)当我删除第一个节点时,第二个节点成为第一个节点,以及以下{{1} }循环将失败。作为替代方案,我可以使用递减 foreach循环。

示例2:按ID删除节点:

for
根据定义,

ID是唯一的,因此if( $node = $dom->getElementById( 'footer-widget-wysija-1' ) ) { $node->parentNode->removeChild( $node ); } 只返回一个元素:如果找到,我可以使用->getElementById()删除它

输出HTML:

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

->removeChild()