我正在为我的网站创建搜索脚本。但我想在每个搜索结果的描述中italic
匹配的单词。我正在使用的脚本位于PHP
,而描述段落的变量为$search_desc
。目前我正在使用str_ireplace()
功能来实现我的目标。 但我认为我的目标太遥远了!这是函数
echo str_ireplace($search_query,"<i>".$search_query."</i>",$search_desc);
但问题是如果搜索查询是search
,例如搜索结果的描述是,
这是搜索演示的说明。
将italic
属性添加到显示的匹配单词
这是搜索演示的说明。
所以你可以看到问题很严重。因为原始描述被编辑!所以任何人都对我的问题有任何想法?如果你确实告诉我了,请告诉我!
答案 0 :(得分:8)
我认为你想要使用的是preg_replace。
http://php.net/manual/en/function.preg-replace.php
此功能允许您使用已找到的单词的标记进行搜索和替换。这样的事情可能有用:
$string = "This is description for Search Demo";
$searchingFor = "/" . $searchQuery . "/i";
$replacePattern = "<i>$0<\/i>";
preg_replace($searchingFor, $replacePattern, $string);
此代码可能有错误,我只是快速将它们放在一起。但我认为这是适合您情况的正确选择。
答案 1 :(得分:2)
我认为您可以使用javascript轻松实现目标。试试这个:
1)包括以下代码:
<style>
<!--
SPAN.searchword { font-style:italic; }
// -->
</style>
<script type="text/javascript">
function stripVowelAccent(str)
{
var rExps=[ /[\xC0-\xC2]/g, /[\xE0-\xE2]/g,
/[\xC8-\xCA]/g, /[\xE8-\xEB]/g,
/[\xCC-\xCE]/g, /[\xEC-\xEE]/g,
/[\xD2-\xD4]/g, /[\xF2-\xF4]/g,
/[\xD9-\xDB]/g, /[\xF9-\xFB]/g ];
var repChar=['A','a','E','e','I','i','O','o','U','u'];
for(var i=0; i<rExps.length; ++i)
str=str.replace(rExps[i],repChar[i]);
return str;
}
/* Modification of */
/* http://www.kryogenix.org/code/browser/searchhi/ */
/* See: */
/* http://www.tedpavlic.com/post_highlighting_search_results_with_ted_searchhi_javascript.php */
/* http://www.tedpavlic.com/post_inpage_highlighting_example.php */
/* for additional modifications of this base code. */
function highlightWord(node,word,doc) {
doc = typeof(doc) != 'undefined' ? doc : document;
// Iterate into this nodes childNodes
if (node.hasChildNodes) {
var hi_cn;
for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) {
highlightWord(node.childNodes[hi_cn],word,doc);
}
}
// And do this node itself
if (node.nodeType == 3) { // text node
tempNodeVal = stripVowelAccent(node.nodeValue.toLowerCase());
tempWordVal = stripVowelAccent(word.toLowerCase());
if (tempNodeVal.indexOf(tempWordVal) != -1) {
pn = node.parentNode;
if (pn.className != "searchword") {
// word has not already been highlighted!
nv = node.nodeValue;
ni = tempNodeVal.indexOf(tempWordVal);
// Create a load of replacement nodes
before = doc.createTextNode(nv.substr(0,ni));
docWordVal = nv.substr(ni,word.length);
after = doc.createTextNode(nv.substr(ni+word.length));
hiwordtext = doc.createTextNode(docWordVal);
hiword = doc.createElement("span");
hiword.className = "searchword";
hiword.appendChild(hiwordtext);
pn.insertBefore(before,node);
pn.insertBefore(hiword,node);
pn.insertBefore(after,node);
pn.removeChild(node);
}
}
}
}
function unhighlight(node) {
// Iterate into this nodes childNodes
if (node.hasChildNodes) {
var hi_cn;
for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) {
unhighlight(node.childNodes[hi_cn]);
}
}
// And do this node itself
if (node.nodeType == 3) { // text node
pn = node.parentNode;
if( pn.className == "searchword" ) {
prevSib = pn.previousSibling;
nextSib = pn.nextSibling;
nextSib.nodeValue = prevSib.nodeValue + node.nodeValue + nextSib.nodeValue;
prevSib.nodeValue = '';
node.nodeValue = '';
}
}
}
function localSearchHighlight(searchStr,doc) {
doc = typeof(doc) != 'undefined' ? doc : document;
if (!doc.createElement) return;
if (searchStr == '') return;
// Trim leading and trailing spaces after unescaping
searchstr = unescape(searchStr).replace(/^\s+|\s+$/g, "");
if( searchStr == '' ) return;
phrases = searchStr.replace(/\+/g,' ').split(/\"/);
// Use this next line if you would like to force the script to always
// search for phrases. See below as well!!!
//phrases = new Array(); phrases[0] = ''; phrases[1] = searchStr.replace(/\+/g,' ');
for(p=0;p<phrases.length;p++) {
phrases[p] = unescape(phrases[p]).replace(/^\s+|\s+$/g, "");
if( phrases[p] == '' ) continue;
if( p % 2 == 0 ) words = phrases[p].replace(/([+,()]|%(29|28)|\W+(AND|OR)\W+)/g,' ').split(/\s+/);
else { words=Array(1); words[0] = phrases[p]; }
for (w=0;w<words.length;w++) {
if( words[w] == '' ) continue;
highlightWord(doc.getElementsByTagName("body")[0],words[w],doc);
}
}
}
</script>
2)调用函数
<script language="javascript">
window.onload=localSearchHighlight('search search');
</script>