我们正在寻找,可以使用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();
答案 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>