2010-10-13 7 views
1

J'ai une liste de mots dans un tableau. Je dois rechercher des correspondances sur une chaîne pour l'un de ces mots.PHP Regex pour faire correspondre une liste de mots avec une chaîne

Exemple mot liste

company 
executive 
files 
resource 

Exemple chaîne

Executives are running the company 

Voici la fonction que je l'ai écrit, mais cela ne fonctionne pas

$matches = array(); 
$pattern = "/^("; 
foreach($word_list as $word) 
{ 
    $pattern .= preg_quote($word) . '|'; 
} 

$pattern = substr($pattern, 0, -1); // removes last | 
$pattern .= ")/"; 

$num_found = preg_match_all($pattern, $string, $matches); 

echo $num_found; 

Sortie

0 
+1

Quelle sortie attendez-vous pour cet exemple? – Gumbo

Répondre

5
$regex = '(' . implode('|', $words) . ')'; 
+4

Si vous n'avez pas le contrôle sur les mots, vous devriez probablement 'array_map()' par 'preg_quote()'. – alex

+1

@alex Mais ce serait deux lignes. – amphetamachine

+0

Je pense que deux lignes est un petit prix à payer pour le rendre compatible avec toute chaîne entrée par l'utilisateur: P – alex

0

Assurez-vous que vous ajoutez le drapeau « m » pour faire le match ^ début d'une ligne:

$expression = '/foo/m'; 

Ou retirer le ^ si vous ne voulez pas correspondre au début d'une ligne ...

1
<?php 

$words_list = array('company', 'executive', 'files', 'resource'); 
$string = 'Executives are running the company'; 

foreach ($words_list as &$word) $word = preg_quote($word, '/'); 

$num_found = preg_match_all('/('.join('|', $words_list).')/i', $string, $matches); 
echo $num_found; // 2 
Questions connexes