php
2011-10-17 21 views 2 likes 
2

如何爲每個搜索詞打包html標籤,如突出顯示單詞。我在這裏嘗試了我的代碼,但沒有任何改變。問題在哪裏,還是有其他好的方法?謝謝。php如何爲每個搜索詞打包html標籤,

<?php 
$sentence = "for loops are the most complex loops in PHP. They behave like their C counterparts";//original 
$search = 'php counterparts';//search words 
$str = explode(' ',$search);//explode every search word 
for($i=0;$i<10;$i++){ 
    if($str[$i]!=''){ //make sure if $str[$i] is not empty, do $newstr. 
     $newstr .= '\'<b>'.$str[$i].'</b>\','; //wrap <b> tag for search words 
    } 
} 
$newstr = substr($newstr, 0, strlen($newstr)-1);//remove last common, combine a array 

$new = str_ireplace(array($str),array($newstr),$sentence); 
echo $new; 
?> 
+0

你能更好地解釋什麼是你正在試圖做的?你的代碼雖然很受評論,但並不能完全解釋事情。你想要達到什麼輸出? – JRSofty

回答

3

爲什麼數組有界10次迭代?你爲什麼用一個字符串來保存修改後的單詞?爲什麼當你不使用正則表達式函數進行替換時,正則表達式分界符?

甚至不要爲了解決這個問題 - 從頭開始​​:

$sentence = "for loops are the most complex loops in PHP. They behave like their C counterparts";//original 
$search = 'php counterparts';//search words 
$srch_words = explode(' ',$search);//explode every search word 
$replace_words=array(); 
foreach ($srch_words as $key=>$val) { 
    $replace_words[$key]='<b>' . $val . '</b>'; 
} 
$sentence=str_ireplace($srch_words, $replace_words, $sentence); 
0

我會試試這種方式。它更安全,索引更少。可能會稍微慢一些,但這應該不是問題。

<?php 
function highlightWords(array $words, $text) { 
    $pattern = '#('; 
    for ($i=0; $i<sizeof($words); ++$i) { 
     $pattern .= ($i > 0) ? '|' : ''; 
     $pattern .= preg_quote($words[$i]); 
    } 
    $pattern .= ')#i'; 
    return preg_replace_callback($pattern, 'highlightMatch', $text); 
} 
function highlightMatch ($matches) { 
    return sprintf('<b>%s</b>', $matches[0]); 
} 

不太漂亮,但也許更快的將是:

<?php 
function highlightWords (array $words, $text) { 
    $find = array(); 
    $replace = array(); 
    foreach ($words as $word) { 
     $find[] = $word; 
     $replace[] = sprintf('<b>%s</b>', $word); 
    } 
    return str_replace($find, $replace, $text); 
} 
2

這將是一個辦法:

<?php 

$words = array('blue', 'red'); 
foreach ($words as $word) { 
    $matchWords[] = "/$word/i"; 
} 
$string = 'Red, orange, yellow, green, blue, indigo, violet. More red, bluebell'; 

$string = preg_replace($matchWords, '<span class="keyword">$0</span>', $string); 

echo $string; 

將輸出:

<span class="keyword">Red</span>, orange, yellow, green, <span class="keyword">blue</span>, indigo, violet. More <span class="keyword">red</span>, <span class="keyword">blue</span>bell 

然後,您可以使用CSS應用高光。您可能想要修改正則表達式以匹配整個單詞

+0

最佳答案我找到該主題。非常感謝! – medoingthings

+0

我使用了這段代碼,而且大部分都很好用。但是對於這個例子也是如此。如果matchWords在其中有'span',它將在span標籤中包裝現有的跨度詞,結果會非常混亂。任何建議如何我可以解決它? – galdikas

1
$str = "for loops are the most complex loops in PHP. They behave like their C counterparts";//original 
$search = 'PHP counterparts'; 
$explode = explode(" ", $search); 

foreach($explode as $word){ 
    $str = preg_replace("/$word/i", '<strong>$0</strong>', $str); 
} 

echo $str; 
相關問題