2010-06-17 2 views
4

Хорошо, я пытаюсь сделать поисковые запросы полужирным шрифтом в этом сценарии поиска, который я делаю, за исключением того, что я не могу заставить его работать без учета регистра.PHP Нечувствительный Word Word

function highlight($term,$target){ 
    $terms = explode(" ", $term); 

    foreach($terms as $term){ 
     $result = (eregi_replace($term, "<strong>$term</strong>", $target)); 
    } 
    return $result; 
} 

То есть функция у меня до сих пор .. Это говорит о том, что PHP.net eregi_replace чувствителен к регистру сравнение, но это, очевидно, не работает по какой-то причине. (Я ноб).

Любые идеи? : D

ответ

8

ereg_* (POSIX регулярных выражений) функции deprecated в РНР 5.3 и не было предложено в течение длительного времени. Лучше использовать функции PCRE (preg_*) (например, preg_replace).

Вы можете сделать это путем создания регистронезависимого регулярное выражения, а затем оборачивать матчи в <strong> тегах:

function highlight($term, $target) 
{ 
    $terms = array_unique(explode(" ", $term)); // we only want to replace each term once 
    foreach ($terms as $term) 
    { 
    $target = preg_replace('/\b(' . preg_quote($term) . ')\b/i', "<strong>$1</strong>", $target); 
    } 

    return $target; 
} 

Что это делает первый вызов preg_quote на ваш $term, так что если есть какие-либо символы, имеют значение в регулярном выражении в терминах, они экранируются, а затем создают регулярное выражение, которое ищет этот термин, окруженный границами слов (\b - так что, если термин «хороший», он не будет соответствовать «до свидания») , Этот термин заключен в круглые скобки, чтобы заставить механизм регулярных выражений использовать термин в его существующей форме как «обратную ссылку» (способ, по которому механизм регулярных выражений зависает на части соответствия). Выражение сделано нечувствительным к регистру, указав опцию i. Наконец, он заменяет любые совпадения той же обратной ссылкой, окруженной тегом <strong>.

$string = "The quick brown fox jumped over the lazy dog. The quicker brown fox didn't jump over the lazy dog."; 
$terms = "quick fox"; 
highlight($terms, $string); 
// results in: The <strong>quick</strong> brown <strong>fox</strong> jumped over the lazy dog. The quicker brown <strong>fox</strong> didn't jump over the lazy dog. 

Если вы хотите хороший учебник по регулярным выражениям, проверить учебник по regular-expressions.info.

+1

'str_ireplace' превратит' Clock' в текст в 'clock', если пользователь выполнил поиск' clock'. Нехороший вариант. –

+0

Хорошо, я уточню свой ответ. –

+0

@Pekka, он попросил нечувствительность к регистру, почему это нехороший вариант. Он делает именно это. –

0
function highlight($term,$target) 
{ 
    $terms = explode(" ", $term); 

    foreach($terms as $term){ 
     $target = (str_ireplace($term, "<strong>$term</strong>", $target)); 
    } 
    return $target; 
} 
Смежные вопросы