2010-03-20 4 views
25

, как писать сценарий, который заключает в себе все слово, если оно содержит ключевое слово? пример: ключевое слово "fun", строка - птица смешная, результат - птица * смешная *. я делаю следующеевыделите слово в строке, если оно содержит ключевое слово

 $str = "my bird is funny"; 
    $keyword = "fun"; 
    $str = preg_replace("/($keyword)/i","<b>$1</b>",$str); 

но это только одно ключевое слово. моя птица весело пу

ответ

39

Попробуйте это:

preg_replace("/\w*?$keyword\w*/i", "<b>$0</b>", $str) 

\w*? матчи любое слово символов перед ключевое слово (как можно меньше) и \w* слова любого слова после ключевого слова.

И я рекомендую вам использовать preg_quote, чтобы избежать ключевого слова:

preg_replace("/\w*?".preg_quote($keyword)."\w*/i", "<b>$0</b>", $str) 

Для поддержки Unicode, используйте флаг у и \p{L} вместо \w:

preg_replace("/\p{L}*?".preg_quote($keyword)."\p{L}*/ui", "<b>$0</b>", $str) 
+0

поздравления, это работает. спасибо – Simon

+0

+1. Это работает и быстро отвечает. Почему? в шаблоне? – sberry

+0

@ sberry2A: регулярные выражения PCRE жадный по умолчанию. Это означает, что квантификатор расширяется до максимального возможного повторения. '' 'делает квантификатор неровным, поэтому он соответствует наименьшему количеству повторений (см. также http://www.regular-expressions.info/ repeat.html) – Gumbo

4

Вы можете сделать следующее:

$str = preg_replace("/\b([a-z]*${keyword}[a-z]*)\b/i","<b>$1</b>",$str); 

Пример:

$str = "Its fun to be funny and unfunny"; 
$keyword = 'fun'; 
$str = preg_replace("/\b([a-z]*${keyword}[a-z]*)\b/i","<b>$1</b>",$str); 
echo "$str"; // prints 'Its <b>fun</b> to be <b>funny</b> and <b>unfunny</b>' 
+0

@codaddict я знаю, что в регулярных выражениях $ означает конец чего-то. но что это значит в вашем скрипте? и почему {simbols, а не (? – Simon

+0

@Syom: Это только для PHP, чтобы различать между переменными и литеральным содержимым строки в объявлениях с двойными кавычками: '' $ foobar "' будет оцениваться до значения '$ foobar' while '' ($ foo} bar "'/'" $ {foo} bar "' будет оценен до значения '$ foo', объединенного с' bar'. См. http://php.net/manual/en/language .types.string.php # language.types.string.parsing для получения дополнительной информации. – Gumbo

-2

Поиск и выделить слово в строке, тексте, теле и абзаце:

<?php $body_text='This is simple code for highligh the word in a given body or text'; //this is the body of your page 
$searh_letter = 'this'; //this is the string you want to search for 
$result_body = do_Highlight($body_text,$searh_letter); // this is the result with highlight of your search word 
echo $result_body;   //for displaying the result 
function do_Highlight($body_text,$searh_letter){  //function for highlight the word in body of your page or paragraph or string 
    $length= strlen($body_text); //this is length of your body 
    $pos = strpos($body_text, $searh_letter); // this will find the first occurance of your search text and give the position so that you can split text and highlight it 
    $lword = strlen($searh_letter); // this is the length of your search string so that you can add it to $pos and start with rest of your string 
    $split_search = $pos+$lword; 
    $string0 = substr($body_text, 0, $pos); 
    $string1 = substr($body_text,$pos,$lword); 
    $string2 = substr($body_text,$split_search,$length); 
    $body = $string0."<font style='color:#FF0000; background-color:white;'>".$string1." </font> ".$string2; 
    return $body; 
    } ?> 
+0

Это очень простой пример, вы можете просто скопировать вставку и изменить в соответствии с требованиями ur. –

+0

ваши решения содержат ту же проблему, о которой спрашивает OP, она выделяет только символы, соответствующие ключевому слову, а не слово, содержащее символы. –

1
<?php 
$str = "my bird is funny"; 

$keyword = "fun"; 
$look = explode(' ',$str); 

foreach($look as $find){ 
    if(strpos($find, $keyword) !== false) { 
     if(!isset($highlight)){ 
      $highlight[] = $find; 
     } else { 
      if(!in_array($find,$highlight)){ 
       $highlight[] = $find; 
      } 
     } 
    } 
} 

if(isset($highlight)){ 
    foreach($highlight as $replace){ 
     $str = str_replace($replace,'<b>'.$replace.'</b>',$str); 
    } 
} 

echo $str; 
?> 
+0

Используйте 'str_ireplace()' вместо 'str_replace()', которая нечувствительна к регистру версии 'str_replace()' –

-1

Здесь М.З. добавил мульти поиска в строке для справки

$keyword = ".in#.com#dot.com#1#2#3#4#5#6#7#8#9#one#two#three#four#five#Six#seven#eight#nine#ten#dot.in#dot in#"; 

$keyword = implode('|',explode('#',preg_quote($keyword))); 

$str = "PHP is dot .com the amazon.in 123455454546 dot in scripting language of choice."; 

$str = preg_replace("/($keyword)/i","<b>$0</b>",$str); 
echo $str; 
+0

Thanks Walery Strauch – Johnson

Смежные вопросы