Regexp示例:
原文链接:https://www.f2er.com/php/135153.html<?PHP function addClass($htmlString = '',$newClass) { $pattern = '/class="([^"]*)"/'; // class attribute set if (preg_match($pattern,$htmlString,$matches)) { $definedClasses = explode(' ',$matches[1]); if (!in_array($newClass,$definedClasses)) { $definedClasses[] = $newClass; $htmlString = str_replace($matches[0],sprintf('class="%s"',implode(' ',$definedClasses)),$htmlString); } } // class attribute not set else { $htmlString = preg_replace('/(\<.+\s)/',sprintf('$1class="%s" ',$newClass),$htmlString); } return $htmlString; } echo addClass('<a class="abc">','newClass'); echo addClass('<p style=display:block>','newClass');
使用http://php.net/manual/en/book.dom.php示例
<?PHP function addClass($node = null,$className) { $result = false; if (is_string($node)) { $dom = DOMDocument::loadXml($node); if ($dom instanceof DOMDocument) { $definedClasses = explode(' ',$dom->documentElement->getAttribute('class')); if (!in_array($className,$definedClasses)) { $dom->documentElement->setAttribute( 'class',$dom->documentElement->getAttribute('class') . ' ' . $className ); } $result = $dom->saveXml($dom->documentElement,true); } } elseif ($node instanceof DOMElement) { // this code repetition,could of course be avoided using some more sophisticated structures $definedClasses = explode(' ',$node->getAttribute('class')); if (!in_array($className,$definedClasses)) { $node->setAttribute('class',$node->getAttribute('class') . ' ' . $className); } $result = $node; } return $result; } // using a string as input echo addClass('<a class="abc"></a>','newClass'); // using a DOMElement as input $dom = DOMDocument::loadHtml('<div><a id="something"></a></div>'); $xpath = new DOMXPath($dom); $node = $xpath->query('//*[@id="something"]')->item(0); if ($node instanceof DOMElement) { addClass($node,'newClass'); echo $dom->saveXml($node,true); }
我故意不使用loadHTML(在函数内部)来防止不得不深入到自动生成的html结构中来找到实际给定的$htmlString.这当然意味着$htmlString必须格式正确.