Я пытаюсь написать поиск и подсветку синтаксиса. Давайте предположим, что у нас есть базовый запрос, который запрашивает страны, например, по ключевому слову. уни.
Прямо сейчас я использую Sphinx, чтобы получить результаты, которые соответствуют этому ключевому слову, из базы данных, и я использую поиск без учета регистра. Результаты, которые возвращает sphinx, следующие:
Tanzania, United Republic of
United Arab Emirates
United Kingdom
United States
Igaunija
Estados unidos Mexicanos
Теперь я хочу выделить ключевое слово поиска из этих строк, обернув ключевое слово в <span>
,
Чтобы добиться этого, я пытался сделать следующее:
$search='uni';
foreach($keyword as $text) { // $keyword is an array, containg each found result one by one
$text=str_replace($search, "<span>".$search."</span>", $text);
}
Только с этим кодом Iguanija
, а также Estados unidos Mexicanos
выделяется, потому что в любом другом случае ключевое слово начинается с заглавной буквы. Если я изменю str_replace
к str_ireplace
, каждое поисковое ключевое слово становится выделенным, но в первых нескольких записях заглавными буквами U
заменяется строчными u
так что из United Kingdom
, Я получил united Kingdom
, Как можно выделить ключевое слово для поиска и сохранить регистр символов в результате?
Мой желаемый результат будет примерно таким:
Tanzania, <span>Uni</span>ted Republic of
<span>Uni</span>ted Arab Emirates
<span>Uni</span>ted Kingdom
<span>Uni</span>ted States
Iga<span>uni</span>ja
Estados <span>uni</span>dos Mexicanos
Вы можете использовать регулярное выражение, которое позволит вам сохранить регистр исходной строки.
<?php
$unis = <<< UNIS
Tanzania, United Republic of
United Arab Emirates
United Kingdom
United States
Igaunija
Estados unidos Mexicanos
UNIS;
var_dump(preg_replace('/(uni)/i','<span>$1</span>',$unis));
Выход
string(190) "Tanzania, <span>Uni</span>ted Republic of
<span>Uni</span>ted Arab Emirates <span>Uni</span>ted Kingdom
<span>Uni</span>ted States Iga<span>uni</span>ja Estados
<span>uni</span>dos Mexicanos"
Других решений пока нет …