【发布时间】:2012-03-09 07:00:22
【问题描述】:
这个问题与我提出的before 相关,但由于该主题现已关闭,我需要进一步提问,我将开始一个新问题,希望没问题。
在我之前的回答中,我充分简化了问题,并产生了简单但不完全有效的解决方案。这些天我在实现我的代码时意识到了这一点。
上一篇文章中解决方案的问题是HTML标签被替换功能破坏了。我在该站点的许多帖子中阅读了我需要使用 DOM Parser 的内容。我对此非常陌生,我尝试了用户“ircmaxell”在此post 中建议的代码,但它对我不起作用。
这是我所做的示例:
echo '<style type="text/css">
.ht{
background-color: yellow;
}
</style>';
/* taken from user ircmaxell at https://stackoverflow.com/questions/4081372/highlight-keywords-in-a-paragraph
I just modified line $highlight->setAttribute('class', 'highlight') to $highlight->setAttribute('class', 'ht') and commented the first 2 lines */
function highlight_paragraph($string, $keyword) {
//$string = '<p>foo<b>bar</b></p>';
//$keyword = 'foo';
$dom = new DomDocument();
$dom->loadHtml($string);
$xpath = new DomXpath($dom);
$elements = $xpath->query('//*[contains(.,"'.$keyword.'")]');
foreach ($elements as $element) {
foreach ($element->childNodes as $child) {
if (!$child instanceof DomText) continue;
$fragment = $dom->createDocumentFragment();
$text = $child->textContent;
$stubs = array();
while (($pos = stripos($text, $keyword)) !== false) {
$fragment->appendChild(new DomText(substr($text, 0, $pos)));
$word = substr($text, $pos, strlen($keyword));
$highlight = $dom->createElement('span');
$highlight->appendChild(new DomText($word));
$highlight->setAttribute('class', 'ht');
$fragment->appendChild($highlight);
$text = substr($text, $pos + strlen($keyword));
}
if (!empty($text)) $fragment->appendChild(new DomText($text));
$element->replaceChild($fragment, $child);
}
}
$string = $dom->saveXml($dom->getElementsByTagName('body')->item(0)->firstChild);
return $string;
}
$string = '<p>This book has been written against a background of both reckless optimism and reckless despair.</p>
<p>It holds that Progress and Doom are two sides of the same medal; that both are articles of superstition, not of faith. It was written out of the conviction that it should be possible to discover the hidden mechanics by which all traditional elements of our political and spiritual world were dissolved into a conglomeration where everything seems to have lost specific value, and has become unrecognizable for human comprehension, unusable for human purpose.</p>
<p> Hannah Arendt, The Origins of Totalitarianism (New York: Harcourt Brace Jovanovich, Inc., 1973 ed.), p.vii, Preface to the First Edition.</p>';
$keywords = array('This', 'book', 'has', 'been', 'written', 'background', 'reckless', 'optimism', 'despair.', 'holds', 'Progress', 'Doom ', 'two', 'sides', 'medal;', 'articles', 'superstition,', 'faith.', 'lost', 'Arendt,', 'Totalitarianism');
foreach ($keywords as $kw) {
$string = highlight_paragraph($string, $kw);
}
echo $string;
echo $string 只返回:
This book has been written against a background of both reckless optimism and reckless despair.
只有前两个单词“This”和“book”被突出显示。
通常它应该输出所有带有突出显示的关键字的初始字符串。
我在 stackoverflow 和 google 中搜索了很多,但没有找到一个易于使用的代码来实现我的目的,即使之前有很多人问过同样的问题。
我在这里真的需要帮助。提前致谢!
【问题讨论】:
标签: php html dom highlighting