使用PHP DOM Parser搜索并替换HTML字符串

时间:2015-11-11 10:46:25

标签: php html parsing dom domparser

如何使用本机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查询的解决方案,具体取决于被搜索的字符串。

谢谢!

2 个答案:

答案 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);