2011-05-03 217 views
0

現在我已經得到了以下所需的標準工作正則表達式的字符串:PHP正則表達式生成器

一個行PHP就緒正則表達式,它包括了一些關鍵字,並keyterms並會匹配其中至少一個。

例如:

Keyterms:

  • apple
  • banana
  • strawberry
  • pear cake

現在如果找到這些關鍵術語中的任何一個,那麼它將返回true。但是,爲了在這裏增加一點難度,pear cake術語應該被拆分爲兩個必須都在字符串中但不必在一起的關鍵字。

例字符串應該返回true:

  • A great cake is made from pear
  • i like apples
  • i like apples and bananas
  • i like cakes made from pear and apples
  • I like cakes made from pears

工作正則表達式是:

/\bapple|\bbanana|\bstrawberry|\bpear.*?\bcake|\bcake.*?\bpear/ 

現在我需要一個PHP函數,將keyterms數組動態創建此正則表達式。堅持不懈的是,一個keyterm可以在該密鑰中包含任意數量的關鍵字。只能找到關鍵詞,但可以存在多個關鍵詞。如上所述,keyterm中的所有單詞都必須以任何順序出現在字符串中。

回答

0

我寫了一個功能你在這裏:

<?php 

function permutations($array) 
{ 
$list = array(); 
for ($i=0; $i<=10000; $i++) { 
    shuffle($array); 
    $tmp = implode(',',$array); 
    if (isset($list[$tmp])) { 
    $list[$tmp]++; 
    } else { 
    $list[$tmp] = 1; 
    } 
} 
ksort($list); 
$list = array_keys($list); 
return $list; 
} 



function CreateRegex($array) 
{ 
    $toReturn = '/'; 
    foreach($array AS $value) 
    { 
     //Contains spaces 
     if(strpos($value, " ") != false) 
     { 
      $pieces = explode(" ", $value); 
      $combos = permutations($pieces); 
      foreach($combos AS $currentCombo) 
      { 
       $currentPieces = explode(',', $currentCombo); 
       foreach($currentPieces AS $finallyGotIt) 
       { 
        $toReturn .= '\b' . $finallyGotIt . '.*?'; 
       } 
       $toReturn = substr($toReturn, 0, -3) . '|'; 
      } 
     } 
     else 
     { 
      $toReturn .= '\b' . $value . '|'; 
     } 
    } 

    $toReturn = substr($toReturn, 0, -1) . '/'; 
    return $toReturn; 
} 




var_dump(CreateRegex(array('apple', 'banana', 'strawberry', 'pear cake'))); 

?> 

我從拿到排列功能:

http://www.hashbangcode.com/blog/getting-all-permutations-array-php-74.html

但我會建議找一個更好的功能,並使用另一個自乍看之下,這款遊戲非常醜陋,因爲無論如何,它都會將$ i增加到10,000。

而且,這裏是代碼中的鍵盤:

http://codepad.org/nUhFwKz1

讓我知道如果有什麼問題吧!

+0

多數民衆贊成真棒,謝謝! – domnissient 2011-05-03 08:01:07