2013-03-15 5 views
0

У меня есть PHP-скрипт, который выполняет поиск в моей базе данных на основе условий, помещенных в поле поиска на веб-сайте. Это возвращает блок текста. Предположим, что мой поисковый запрос на данный момент составляет "test block". Пример моего результата был бы этот блок текста:Динамическая вставка текста в строку (PHP)

Это тестовый блок текста, который был собран из базы данных, используя поисковый запрос.

Теперь мой вопрос: как я могу «изюминка» термин поиск в блоке текста, чтобы пользователь мог понять, почему этот результат был разобран в первую очередь. Используя приведенный выше пример, что-то вроде следующего будет достаточно:

Это испытательный блок текста, который был собран из базы данных из поискового запроса.

Я пробовал несколько вещей до сих пор, что изменит текст, но настоящая проблема, с которой я столкнулся, связана с чувствительностью к регистру. Например, если бы я использовал код:

$exploded = explode(' ', $search_terms); 
foreach($exploded as $word) { 
    // I have to use str_ireplace so the word is actually found 
    $result = str_ireplace($word, '<b>' . $word . '</b>', $result); 
} 

Он будет идти через мой $result и bold любой инстанции слов. Это выглядело бы правильно, как хотелось бы в моем втором примере результата поиска. Но, в том случае, когда пользователь использует "Test Block" вместо "test block" термины поиска будут капитализированы и выглядеть так:

Это тест Блок текста, который был собран из базы данных из поиска запрос.

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

По сути, то, что мне нужно сделать, это найти слово в строке, вставьте текст (<b> в данном примере) непосредственно перед словом, а затем вставить текст непосредственно после слова (</b> в данном примере), сохраняя при этом само слово от замены. Это правила preg_replace и str_replace Я верю, поэтому я действительно зациклен на том, что делать.

Любые провода были бы оценены.

+0

вы можете использовать preg_replace() с помощью $ 1 в запасной части, которая представляет согласованный параметр. http://php.net/manual/en/function.preg-replace.php см. комментарий от anyvie at devlibre dot fr – Waygood

+0

@Waygood Спасибо за это, указывает на меня в правильном направлении. Я думаю, что я просто не понимал 'preg_quote()' достаточно либо. – burmat

ответ

2
$exploded = explode(' ', $search_terms); 
foreach($exploded as $word) { 
    // I have to use str_ireplace so the word is actually found 
    $result = preg_replace("/(".preg_quote($word).")/i", "<b>$1</b>", $result); 
} 

соответствие шаблон http://www.php.net/manual/en/reference.pcre.pattern.syntax.php использует определенные символы, такие как. []/* + и т.д ..так что, если они имеют место в структуре они должны быть экранированы первым с pre_quote();

Шаблонов начинаются и заканчиваются разделителями, чтобы определить шаблон http://www.php.net/manual/en/regexp.reference.delimiters.php

следует моим модификаторы http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php В этом случае я для регистронезависимых

ничего в (скобках) захватывается для последующего использования, либо в $ согласованного параметра или в качестве замены $ 1 или \\ 1 для первого, $ 2 секунды и т.д ..

+0

Это работает, но я честно не знаю, как это сделать. В любом случае, вы можете разбить его на условия неспециалиста для меня? – burmat

+0

Принято для простоты – burmat

0

Вы можете использовать preg_replace:

foreach ($exploded as $word) { 
    $text = preg_replace("`(" . preg_quote($word) . ")`Ui" , "<b>$1</b>" , $text); 
} 
1

Использование preg_replace. В вашем примере

$result = preg_replace("/\\b(" . preg_quote($word) . ")\\b/i", '<b>$1</b>', $result); 
+0

Это работает, но не для первых слов в предложении по какой-то причине .. – burmat

+0

извините, третий аргумент должен быть, конечно, «$ result» вместо "$ слово". Кроме того, модификатор «i» должен быть включен в шаблон: $ result = preg_replace ("/ \\ b (". Preg_quote ($ word). ") \\ b/i", '$ 1', $ результат); –

+0

Ваши исправления работают. Спасибо – burmat

0
$string = 'The quick brown fox jumped over the lazy dog.'; 
$search = "brown"; 
$pattern = "/".$search."/"; 
$replacement = "<strong>".$search."</strong>"; 
echo preg_replace($pattern, $replacement, $string); 

Быстрое коричневое лиса перепрыгнула через ленивую собаку

+0

Что делать, если $ search = "br (. *) Own"; ? – Waygood

+0

Так измените шаблон. Всегда умная задница. :) – karmafunk

+1

Мы живем в странном мире, когда умный - это оскорбление LOL – Waygood

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