如何使用本机PHP DOM Parser在网页中搜索和替换特定字符串(text + html标签)?
例如,搜索
<p> <a href="google.com"> Check this site </a> </p>
此字符串位于html树内部的某处。
我想找到它并用另一个字符串替换它。例如,
<span class="highligher"><p> <a href="google.com"> Check this site </a> </p></span>
请记住,<p>
或<a>
节点没有ID。可以有许多相同的节点,包含不同的文本。
我尝试了str_replace,但它失败了复杂的html标记,所以我现在转向HTML Parsers。
编辑:
要查找和替换的字符串可能包含各种HTML标记,如div,标题,粗体等。所以,我正在寻找一个可以构建正则表达式或DOM xpath查询的解决方案,具体取决于被搜索的字符串。
谢谢!
答案 0 :(得分:2)
这就是你想要的:
<?php
// load
$doc = new DOMDocument();
$doc->loadHTMLFile("filename.html");
// search p elements
$p_elements = $doc->getElementsByTagName('p');
// parse this elements, if available
if (!is_null($p_elements))
{
foreach ($p_elements as $p_element)
{
// get p element nodes
$nodes = $p_element->childNodes;
// check for "a" nodes in these nodes
foreach ($nodes as $node) {
// found an a node - check must be defined better!
if(strtolower($node->nodeName) === 'a')
{
// create the new span element
$span_element = $doc->createElement('span');
$span_element->setAttribute('class', 'highlighter');
// replace the "p" element with the span
$p_element->parentNode->replaceChild($span_element, $p_element);
// append the "p" element to the span
$span_element->appendChild($p_element);
}
}
}
}
// output
echo '<pre>';
echo htmlentities($doc->saveHTML());
echo '</pre>';
此HTML是转换的基础:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><title>Your Title Here</title></head><body bgcolor="FFFFFF">
<hr><a href="http://somegreatsite.com">Link Name</a>
is a link to another nifty site
<h1>This is a Header</h1>
<h2>This is a Medium Header</h2>
<p> <a href="amazon.com"> Check this site </a> </p>
Send me mail at <a href="mailto:support@yourcompany.com">
support@yourcompany.com</a>.
<p> This is a new paragraph!
</p><hr><p> <a href="google.com"> Check this site </a> </p>
</body></html>
输出看起来像这样,它包装了你提到的元素:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><title>Your Title Here</title></head><body bgcolor="FFFFFF">
<hr><a href="http://somegreatsite.com">Link Name</a>
is a link to another nifty site
<h1>This is a Header</h1>
<h2>This is a Medium Header</h2>
<span class="highlighter"><p> <a href="amazon.com"> Check this site </a> </p></span>
Send me mail at <a href="mailto:support@yourcompany.com">
support@yourcompany.com</a>.
<p> This is a new paragraph!
</p><hr><span class="highlighter"><p> <a href="google.com"> Check this site </a> </p></span>
</body></html>
答案 1 :(得分:0)
您可以将正则表达式与preg_replace一起使用。
preg_replace("/<\s*p[^>]*>(.*?)<\s*\/\s*p>/", '<span class="highligher"><p>$1</p></span>', '<p><a href="google.com"> Check this site</a></p>');
preg_replace的第三个参数可用于限制替换次数
http://php.net/manual/en/function.preg-replace.php http://www.pagecolumn.com/tool/all_about_html_tags.htm - 有关HTML正则表达式的更多示例
您需要编辑正则表达式,以便仅使用google href
捕获p标记修改强>
preg_replace("/<\s*\w.*?><a href\s*=\s*\"?\s*(.*)(google.com)\s*\">(.*?)<\/a>\s*<\/\s*\w.*?>/", '<span class="highligher"><p><a href="$1$2">$3</a></p></span>', $string);