given the following string in 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>";
I just want to either empty or remove any class that has "test2" in it, so the result wo开发者_C百科uld be this:
<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>
of if you're removing the element:
<div>
<p>text 1</p>
<p>text 2</p>
<p><span class='test1'>text 3</span></p>
<p>text 4</p>
</div>
I'm happy to use a regex expression or something like PHP Simple HTML DOM Parser, but I have no clue how to use it. And with regex, I know how to find the element, but not the specific attribute associated w/ it, especially if there are multiple attributes like my example above. Any ideas?
The DOMDocument
class is a very straight-forward and easy-to-understand interface designed to assist you in working with your data in a DOM-like fashion. Querying your DOM with xpath selectors should be the task(s) all the more trivial:
Clear All Classes
// 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);
using the PHP Simple HTML DOM Parser
Updated and tested! You can get the simple_html_dom.php include from the above link or here.
for both cases:
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>");
case 1:
foreach($html->find('span[class*="test2"]') as $e)
$e->class = '';
echo $html;
case 2:
foreach($html->find('span[class*="test2"]') as $e)
$e->parent()->innertext = $e->plaintext;
echo $html;
$notest2 = preg_replace(
"/class\s*=\s*'[^\']*test2[^\']*'/",
"class=''",
$src);
C.
You can use any DOM Parser, iterate over every element. Check whether its class
attribute contains test2
class (strpos()) if so then set empty string as a value for class
attribute.
You can also use regular expressions to do that - much shorter way. Just find and replace (preg_replace()) using the following expression: #class=".*?test2.*?"#is
精彩评论