2013-05-28 3 views
4

Я создал функцию, которая выделяет отдельные слова внутри строки. Это выглядит так:Поиск и совпадение нескольких слов с использованием RegEx

function highlight($input, $keywords) { 

    preg_match_all('~[\w\'"-]+~', $keywords, $match); 

    if(!$match) { return $input; } 

    $result = '~\\b(' . implode('|', $match[0]) . ')\\b~i'; 

    return preg_replace($result, '<strong>$0</strong>', $input); 

} 

Мне нужна функция для работы с массивом разных слов, поддерживающих пробел в поиске.

Пример:

$search = array("this needs", "here", "can high-light the text");

$string = "This needs to be in here so that the search variable can high-light the text";

echo highlight($string, $search);

Вот то, что я до сих пор изменить функцию, чтобы работать так, как мне это нужно, чтобы:

function highlight($input, $keywords) { 

    foreach($keywords as $keyword) { 

     preg_match_all('~[\w\'"-]+~', $keyword, $match); 

     if(!$match) { return $input; } 

     $result = '~\\b(' . implode('|', $match[0]) . ')\\b~i'; 

     $output .= preg_replace($result, '<strong>$0</strong>', $keyword); 

    } 

    return $output; 

} 

Obviou sly это не работает, и я не уверен, как заставить это работать (регулярное выражение не является моей сильной стороной).

Другой вопрос, который может быть проблемой, как функция будет иметь дело с множественным совпадением? Такие, как $search = array("in here", "here so");, как результат будет что-то вроде:

This needs to be <strong>in <strong>here</strong> so</strong> that the search variable can high-light the text

Но это должно быть:

This needs to be <strong>in here so</strong> that the search variable can high-light the text

+0

Я мог бы быть неправильно, так как регулярные выражения не являются сильной стороной для меня либо, но не должно быть $ 1 вместо $ 0? – maiorano84

+1

Я действительно не мог ответить на это для вас @ maiorano84, но могу вам сказать, что функция в верхней части этого вопроса работает правильно, используя следующий синтаксис: 'echo highlight (« Доброе утро и мир привет »,« утренний привет »,); ' –

+1

Тогда есть вероятность, что определенная часть верна. Будьте в надежды, вы получите ответ. – maiorano84

ответ

3

Описание

Вы можете взять массив терминов и присоединиться к ним с регулярным выражением или оператором |, затем вставьте их в строку. \b поможет вам не захватывать фрагменты слов.

\b(this needs|here|can high-light the text)\b

enter image description here

Затем запустите это в качестве замены с помощью группы захвата \1?

Пример

Я не очень знаком с Python, но в PHP я хотел бы сделать что-то вроде этого:

<?php 
$sourcestring="This needs to be in here so that the search variable can high-light the text"; 
echo preg_replace('/\b(this needs|here|can high-light the text)\b/i','<strong>\1</strong>',$sourcestring); 
?> 

$sourcestring after replacement: 
<strong>This needs</strong> to be in <strong>here</strong> so that the search variable <strong>can high-light the text</strong> 
+1

Отличный ответ, и намного проще, чем я бы подумал! –

+0

Спасибо за добрые слова :) –

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