如何使用PHP Dom替换数据?

时间:2012-10-01 10:02:38

标签: php dom domdocument

我们正在寻找,可以使用PHP DOM轻松替换值的脚本。 这里我们有一个需要替换的HTML代码

HTML代码

<html>
<head>
<head>
<body>
<div> Explore HISTORY shows, watch videos and full episodes, play games and access articles on historical topics at History.com <p>Miss an episode of your favorite History shows? Go to history.com to catch up on full episodes and video exclusives.</p></div>
<div>Discover what happened today in history. Read about major past events that happened today including special entries on crime, entertainment, and more.</div>
<p>Experience games from your favorite shows, take quizzes, solve puzzles and more!</p>
</body>
</html>

我们必须将{history'(包括粗体/小字符)替换为<u>history</u>

最终的代码是

<html>
<head>
<head>
<body>
<div> Explore <u>HISTORY</u> shows, watch videos and full episodes, play games and access articles on historical topics at <u>History</u>.com <p>Miss an episode of your favorite <u>History</u> shows? Go to <u>history</u>.com to catch up on full episodes and video exclusives.</p></div>
<div>Discover what happened today in <u>history</u>. Read about major past events that happened today including special entries on crime, entertainment, and more.</div>
<p>Experience games from your favorite shows, take quizzes, solve puzzles and more!</p>
</body>
</html>

这是我尝试过的,但它不起作用:

<?php
libxml_use_internal_errors(true);
@$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->loadHTMLFile('http://www.history.com');
@$body = $doc->getElementsByTagName('body');
       $i=0;
 while(is_object($finance = $doc->getElementsByTagName("body")->item($i)))
             {
                      foreach($finance->childNodes as $nodename)
                      {
                          $node = $doc->createElement("para", "<u>as fasd fasd fadsf</u>");
                          if(stristr($nodename->nodeValue, 'search')){
                          $nodename->appendChild($node);
                          echo $nodename->getAttribute."<br>" ;
                          echo $nodename->nodeValue."<br>" ;
                          @$us = true;
                          }
                        echo $nodename->nodeValue."<br>" ;
                        }

       $i++;
             }
libxml_clear_errors();

1 个答案:

答案 0 :(得分:0)

使用DOMXPath查找包含单词“history”不区分大小写的节点,然后将其拆分为新的文本节点。

出于好奇,我继续写下了这个实现。我花了比计划更长的时间,但它绝对有效。我希望它对你有所帮助。

<?php

$doc = new DOMDocument();
$doc->preserveWhiteSpace = FALSE;
$doc->resolveExternals = FALSE;
$doc->loadHTML(<<<END
<html>
<head>
</head>
<body>
<div> Explore HISTORY shows, watch videos and full episodes, play games and access articles on historical topics at History.com <p>Miss an episode of your favorite History shows? Go to history.com to catch up on full episodes and video exclusives.</p></div>
<div>Discover what happened today in history. Read about major past events that happened today including special entries on crime, entertainment, and more.</div>
<p>Experience games from your favorite shows, take quizzes, solve puzzles and more!</p>
</body>
</html>
END
);

echo '<p>Input:</p>'."\n";
echo $doc->saveHTML()."\n";

$word    = 'history';
$lcWord  = strtolower($word);
$wordLen = strlen($word);
$xpath   = new DOMXPath($doc);
$nodes   = $xpath->query('/html/body//text()['.
                           'contains('.
                              'translate(.,"'.strtoupper($word).'","'.$lcWord.'"),'.
                              '"'.$lcWord.'")'.
                         ']');
foreach ($nodes as $node)
{
// Split all occurances of "word" into new text nodes.
    $text    = $node->data;
    $textPos = 0;
    while (($wordPos = stripos($text,$word)) !== FALSE)
    {
        $beforeText = substr($text,$textPos,$wordPos - $textPos);
        $wordText   = substr($text,$wordPos,$wordLen);

    // Add the before text to the DOM.
        $node->parentNode->insertBefore($doc->createTextNode($beforeText),$node);

    // Add the word text to the DOM.
    // Underline this word.
        $uNode = $doc->createElement('u');
        $uNode->appendChild($doc->createTextNode($wordText));
        $node->parentNode->insertBefore($uNode,$node);

    // Repeat for the text after the word.
        $text = substr($text,$wordPos + $wordLen);
    }

// Create a text node for text following the word.
    if ($text)
        $node->parentNode->insertBefore($doc->createTextNode($text),$node);

// Remove the original text node.
    $node->parentNode->removeChild($node);
}

echo '<p>Output:</p>'."\n";
echo $doc->saveHTML()."\n";

?>

输出

<p>Input:</p>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head></head>
<body>
<div> Explore HISTORY shows, watch videos and full episodes, play games and access articles on historical topics at History.com <p>Miss an episode of your favorite History shows? Go to history.com to catch up on full episodes and video exclusives.</p>
</div>
<div>Discover what happened today in history. Read about major past events that happened today including special entries on crime, entertainment, and more.</div>
<p>Experience games from your favorite shows, take quizzes, solve puzzles and more!</p>
</body>
</html>

<p>Output:</p>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head></head>
<body>
<div> Explore <u>HISTORY</u> shows, watch videos and full episodes, play games and access articles on historical topics at <u>History</u>.com <p>Miss an episode of your favorite <u>History</u> shows? Go to <u>history</u>.com to catch up on full episodes and video exclusives.</p>
</div>
<div>Discover what happened today in <u>history</u>. Read about major past events that happened today including special entries on crime, entertainment, and more.</div>
<p>Experience games from your favorite shows, take quizzes, solve puzzles and more!</p>
</body>
</html>