2011-05-03 3 views
0

J'ai maintenant obtenu une chaîne regex de travail pour les critères ci-dessous nécessaires:PHP générateur de regex

une ligne regex php prêt qui englobe un certain nombre de mots-clés, et keyterms et correspondra à au moins un d'entre eux .

Par exemple:

keyterms:

  • apple
  • banana
  • strawberry
  • pear cake

Maintenant, si l'un de ces termes clés est trouvé, il retourne vrai. Cependant, pour ajouter un peu plus de difficulté ici, le terme pear cake devrait être divisé en deux mots-clés qui doivent tous deux être dans la chaîne, mais pas nécessairement ensemble.

cordes Exemple qui doit retourner vrai:

  • 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

Le travail est regex:

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

Maintenant, je besoin d'une fonction php qui va créer cette regex à la volée à partir d'un tableau de keyterms. Le stickler est qu'un keyterm peut avoir n'importe quel nombre de mots-clés dans cette clé. Seulement sur les keyterms doivent être trouvés, mais plusieurs peuvent être présents. Comme ci-dessus tous les mots dans un keyterm doivent apparaître dans la chaîne dans n'importe quel ordre.

Répondre

0

J'ai écrit une fonction pour vous ici:

<?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'))); 

?> 

j'ai eu la fonction de permutations de:

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

mais je vous recommande de trouver une meilleure fonction et utiliser un autre depuis Juste à première vue, celui-ci est assez moche, car il augmente de 1 $ à 10 000, peu importe quoi.

Aussi, voici un clavier à code pour le code:

http://codepad.org/nUhFwKz1

Laissez-moi savoir s'il y a quelque chose de mal avec elle!

+0

C'est génial, merci! – domnissient