在PHP中,如何从html标签中删除特定的类?

时间:2010-01-21 11:07:19

标签: php html regex dom tags

在PHP中给出以下字符串:

$html = "<div>
<p><span class='test1 test2 test3'>text 1</span></p>
<p><span class='test1 test2'>text 2</span></p>
<p><span class='test1'>text 3</span></p>
<p><span class='test1 test3 test2'>text 4</span></p>
</div>";

我只想要清空或删除任何包含“test2”的类,结果就是这样:

<div>
<p><span class=''>text 1</span></p>
<p><span class=''>text 2</span></p>
<p><span class='test1'>text 3</span></p>
<p><span class=''>text 4</span></p>
</div>

如果你要删除元素:

<div>
<p>text 1</p>
<p>text 2</p>
<p><span class='test1'>text 3</span></p>
<p>text 4</p>
</div>

我很高兴使用正则表达式或PHP Simple HTML DOM Parser之类的东西,但我不知道如何使用它。使用正则表达式,我知道如何找到元素,但不知道与它相关的特定属性,特别是如果有多个属性,如上面的例子。有什么想法吗?

4 个答案:

答案 0 :(得分:6)

DOMDocument类是一个非常直观且易于理解的界面,旨在帮助您以类似DOM的方式处理数据。使用xpath选择器查询DOM应该是更简单的任务:

清除所有课程

// Build our DOMDocument, and load our HTML
$doc = new DOMDocument();
$doc->loadHTML($html);

// Preserve a reference to our DIV container
$div = $doc->getElementsByTagName("div")->item(0);

// New-up an instance of our DOMXPath class
$xpath = new DOMXPath($doc);

// Find all elements whose class attribute has test2
$elements = $xpath->query("//*[contains(@class,'test2')]");

// Cycle over each, remove attribute 'class'
foreach ($elements as $element) {
    // Empty out the class attribute value
    $element->attributes->getNamedItem("class")->nodeValue = '';
    // Or remove the attribute entirely
    // $element->removeAttribute("class");
}

// Output the HTML of our container
echo $doc->saveHTML($div);

答案 1 :(得分:4)

使用PHP Simple HTML DOM Parser

已更新并经过测试! 您可以从上面的链接或here获取simple_html_dom.php。

两种情况:

include('../simple_html_dom.php');

$html = str_get_html("<div><p><span class='test1 test2 test3'>text 1</span></p>
<p><span class='test1 test2'>text 2</span></p>
<p><span class='test1'>text 3</span></p>
<p><span class='test1 test3 test2'>text 4</span></p></div>");

案例1:

foreach($html->find('span[class*="test2"]') as $e)
$e->class = '';

echo $html;

案例2:

foreach($html->find('span[class*="test2"]') as $e)
$e->parent()->innertext = $e->plaintext;

echo $html;

答案 2 :(得分:3)

$notest2 = preg_replace(
         "/class\s*=\s*'[^\']*test2[^\']*'/", 
         "class=''", 
         $src);

下进行。

答案 3 :(得分:1)

您可以使用任何DOM Parser,遍历每个元素。检查其class属性是否包含test2类(strpos()),如果是,则将空字符串设置为class属性的值。

你也可以使用正则表达式来做到这一点 - 更短的方式。只需使用以下表达式查找并替换(preg_replace()):#class=".*?test2.*?"#is