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

Jam*_*ine 3 html php regex tags dom

在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>";
Run Code Online (Sandbox Code Playgroud)

我只想要清空或删除任何包含"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>
Run Code Online (Sandbox Code Playgroud)

如果你要删除元素:

<div>
<p>text 1</p>
<p>text 2</p>
<p><span class='test1'>text 3</span></p>
<p>text 4</p>
</div>
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*son 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);
Run Code Online (Sandbox Code Playgroud)