2013-05-31 1 views
0

У меня есть следующий набор данных:Regex ключевое предложение

names = ["brad pitt", "george clooney", "james cameron"]; 

Мне нужно регулярное выражение, которое соответствует "Brad Pitt" и "Джордж Клуни" подарил:

"brad peter clooney" 

Кроме того, она должна соответствовать: "brad pitt" когда запрос равен "brad peter pitt"

Обратите внимание, что я использую PHP, и я могу разделить запрос и манипулировать им. например, я могу попробовать это:

((brad)+.*(peter)+.*(pitt)+.*+) 

, но его не будет совпадать, так как у меня есть 1 или больше после каждого имени, а если поместить * (0 или более) его будет соответствовать все записи, так как это также означает, ничего не согласен.

+0

Каким образом делает 'штифтика питер clooney' матч' Брэд pitt' и 'ДЖОРДЖ clooney'? Я нахожу это немного неясным. Является основным вопросом «как проверить, содержит ли данная строка один из набора строк»? – Vulcan

+0

Это сервис подсказки ключевых слов, где, если вы наберете: brad peter clooney, система должна иметь возможность предлагать оба имени. Я мог бы использовать любое из трех слов типа «/(.*brad.*)|(.*peter.*)|(.*clooney.*)i/», но это будет соответствовать множеству других предметов. Так, например, если вы ищете brad pitt. его также принесет «brad james» – Reza

+1

Для такого поиска я бы рекомендовал использовать итеративный подход к словам в каждой строке, а не в регулярном выражении, для ясности. Я бы предположил, что этот подход также будет выполняться быстрее, чем запустить регулярное выражение с многочисленными разделителями OR, но это потребует тестирования. – Vulcan

ответ

0

Таким образом, вы хотите совместить строку, если в ней есть какие-либо слова. Для этого можно разбить строку на \s+ и использовать каждое слово в выражении как:

word1|word2|word3 

Вы можете также добавить некоторые \b с и /i, например (// цитировал этот раз):

/\b(?:word1|word2|word3)\b/i 

Или вы можете использовать три отдельных выражения или indexOf() чеков.

+0

isnt это то же самое, что: «/(.*brad.*)|(.*peter.*)|(.*clooney.*)i/« В этом случае он разбивает ключевые слова, поэтому также «brad james "появляется, когда вы ищете" brad pitt " – Reza

0

хорошо здесь простая идея:

$arr = array("brad pitt", "george clooney", "james cameron"); 
$str = "brad peter clooney"; 

foreach($arr as $val) 
{ 
    $tmpptrn = str_replace(" ", "|", $val); 
    $pattern = "/($tmpptrn)/i"; 

    if(preg_match_all($pattern, $str, $matches)) 
    { 
     //do whatever with the results 

     $match = $matches[1][0]; 
     if(!empty($match)) 
     { 
      $arra[] = array_filter($arr, function($el) use ($match) { return (strpos($el, $match) !== false); }); 

     } 

    } 
} 

//print out the results 
print_r($arra); 
Смежные вопросы