Obtenir un extrait de texte

Eléphant du PHP | 99 Messages

31 juil. 2007, 16:42

Salut à tous!
Mon nouveau problème consisite à obtenir un extrait d'un texte. En fait, l'entrée est un texte de ce type:
Lorem ipsum dolor sit amet consectetuer eu fermentum urna Lorem nisl. Justo et convallis libero eget magna Curabitur nulla justo feugiat nibh. Dui Vivamus at mauris eros Curabitur Aliquam wisi Quisque id augue. Id sit sed auctor tellus egestas justo Sed sollicitudin consequat platea. Donec vel sociis quis Nam Donec ac id quis.
Mais à la sortie, il faut que ça devienne:
Lorem ipsum dolor sit amet consectetuer [...] eu fermentum urna Lorem nisl. Justo et convallis libero eget [...]
En fait, il faut qu'il trouve les mots-clés, et qu'il sélectionne les X mots précédents et suivants, et ce pour un certain nombre de phrases uniquement (pour ne pas surcharger la description)...
J'ai essayé avec les regexp (preg_matrch_all) mais ça ne marche pas...
Est-ce que vous sauriez comment faire?

Merci!

(pour info, ma regex est: ((([^ ]* )*)lorem(( [^ ]*)*))#Uis)

ViPHP
ViPHP | 5924 Messages

31 juil. 2007, 17:44

Utilise preg_replace() plutôt. Et “ca ne marche pas”, ca ne veut rien dire…

Eléphant du PHP | 99 Messages

31 juil. 2007, 17:51

Bon, j'ai un peu avancé depuis tout-à-l'heure. Maintenant, je réussis à sortir les 4 mots qui précèdent, mais pas les quatres mots qui suivent... :(
preg_match_all('#(([^ ]* ){1,4} ?lorem( ([^ ]*)){1,4})#Ui',$tmp['contentText'],$words);
echo '<pre>'.print_r($words,true).'</pre>';
Et pour le 'ça ne marche pas', c'est qu'il me retourne soit un texte tronqué je ne sais pas comment, sois un texte complet :?

ViPHP
ViPHP | 5924 Messages

31 juil. 2007, 18:04

'/(^|(^|\W+(\w+)){1,4}\W+)lorem($|\W+((\w+)\W+|$){1,4})/Ui'
Ca peut peut être marcher…

Eléphant du PHP | 99 Messages

31 juil. 2007, 18:25

Il y a un plus: maintenant, il y a un mot après le texte qui est sélectionné

ViPHP
ViPHP | 5924 Messages

31 juil. 2007, 19:05

Met un ? après ton second {1,4} histoire de le rendre gourmand.

Eléphant du PHP | 99 Messages

31 juil. 2007, 19:09

ça avance, maintenant il réunit tous, mais il ne réunit qu'une phrase alors qu'il y a plusieurs occurences. Ce ne serait pas à cause des délimiteur ^et $?

ViPHP
ViPHP | 5924 Messages

31 juil. 2007, 19:22

Non, ca sert à lui indiquer de considérer qu'il y a les 4 mots s'il arrive à la fin ou s'il part du début de la chaine.
Vérifie les résultats de preg_match_all() avec un var_dump()

Eléphant du PHP | 99 Messages

31 juil. 2007, 19:39

Ah! Ca a l'air de marcher, en fait. C'est juste qu'il faut que le texte tienne sur une seule ligne. A la limite, ça m'arrange, donc bon...
Merci!

ViPHP
ViPHP | 5924 Messages

31 juil. 2007, 20:53

Pour le problème du texte qui tient sur une ligne, tu peux utiliser l'option “D” qui considère le début et la fin réelle de la chaine (sans cette option, une nouvelle ligne est considérée comme limitateur de chaine).
Sinon, pense bien à tester l'expression, et de l'optimiser (là elle est un peu bourrin quand même, …)