2010-09-04 3 views
1

J'essaie de tirer toutes les phrases d'un texte composé, disons, d'au moins 5 mots en PHP. En supposant des phrases se terminent par arrêt complet, une question ou un point d'exclamation, je suis venu avec ceci:Regex pour faire correspondre des phrases avec au moins n mots

/[\w]{5,*}[\.|\?|\!]/ 

Toutes les idées, ce qui ne va pas?

En outre, que faut-il faire pour que cela fonctionne avec UTF-8?

+1

« Toutes les idées , Qu'est-ce qui ne va pas?" Qu'est-ce qui s'est réellement passé? Une erreur? Vous n'avez pas fait ce que vous attendiez de lui? –

Répondre

5

\w ne correspond qu'à un seul caractère. Un seul mot serait \w+. Si vous avez besoin d'au moins 5 mots, vous pourriez faire quelque chose comme:

/(\w+\s){4,}\w+[.?!]/ 

à savoir au moins 4 mots suivis par des espaces, suivi d'un autre mot suivi d'un délimiteur de phrase.

+0

+1 pour être plus rapide – bitmask

0

Je suis d'accord avec la solution affichée ici. Si vous utilisez des fonctions preg en PHP, vous pouvez ajouter un modificateur de mod 'u' pour que cela fonctionne avec UTF-8. /(\w+\s){4,}\w+[.?!]/u par exemple

0

Le sans méthode regex:

$str = "this is a more than five word sentence. But this is not. Neither this. NO"; 

$sentences = explode(".", $str); 
foreach($sentences as $s) 
{ 
    $words = explode(' ', $s); 
    if(count(array_filter($words, 'is_notempty')) > 5) 
     echo "Found matching sentence : $s" . "<br/>"; 
} 

function is_notempty($x) 
{ 
return !empty($x); 
} 

Ce sorties:

Trouvé phrase correspondant: cela est un plus de cinq mots phrase

+0

Notez que vous ne pouvez "exploser" qu'avec un seul délimiteur. Le PO a déclaré que les phrases pouvaient se terminer par n'importe lequel des mots ".?!". – casablanca

Questions connexes