PHP выделить ключевые слова поиска, используя preg_replace с массивом - PullRequest
1 голос
/ 30 апреля 2011

Я использую эту функцию из здесь , которая:

// highlight search keywords 
function highlight($title, $search) {
preg_match_all('~\w+~', $search, $m);
if(!$m)
    return $title;
    $re = '~\\b(' . implode('|', $m[0]) . ')\\b~i';

return preg_replace($re, '<span style="background-color: #ffffcc;">$0</span>', $title);
}

, которая прекрасно работает, но только для названий.Я хочу иметь возможность передать массив, который содержит $ title и $ description.

Я пытался что-то вроде этого:

$replacements = array($title, $description);

// highlight search keywords 
function highlight($replacements, $search) {
preg_match_all('~\w+~', $search, $m);
if(!$m)
    return $replacements;
    $re = '~\\b(' . implode('|', $m[0]) . ')\\b~i';

return preg_replace($re, '<span style="background-color: #ffffcc;">$0</span>', $replacements);
}

Это не работает.Он передает массив в качестве заголовка и не выделяет описание (хотя на самом деле возвращает описание).Есть идеи, как заставить это работать?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

Я бы лично оставил исходную функцию как работающую только с одним параметром, а не с массивом. Это сделает ваш код вызова красивым и понятным;

$titleHighlighted = highlight($title, $searchKeywords);
$descriptionHighlighted = highlight($title, $searchKeywords);

Однако я бы переписал вашу функцию для использования str_ireplace, а не preg_replace;

function highlight($contentBlock, array $keywords) {
        $highlightedContentBlock = $contentBlock;

        foreach ($keywords as $singleKeyword) {
                $highlightedKeyword = '<span class = "keyword">' . $singleKeyword . '</span>';
                $highlightedContentBlock = str_ireplace($singleKeyword, $highlightedKeyword, $highlightedContentBlock);
        }   

        return $highlightedContentBlock;
}

Эта переписанная функция должна быть более простой для чтения и не требует дополнительных затрат при составлении регулярных выражений. Вы можете вызывать его сколько угодно раз для любого блока контента (заголовок, описание и т. Д.);

$title = "The quick brown fox jumper over ... ";

$searchKeywords = array("quick", "fox");
$titleHighlighted = highlight($title, $searchKeywords);

echo $titleHighlighted; // The <span class = "keyword">quick</span> brown ...
0 голосов
/ 26 февраля 2014

Вы пытались изменить?

$m[0]

с

$m[0][0]
...