Page 1 sur 1

recherche dans un type text d'une base de données

Posté : 27 juin 2007, 13:15
par bartz
Salut,

Je souhaite afficher le contenu d'un champs d'une table qui est du type text.
Cependant, je voudrais afficher seulement les 3 premieres phrases s'il en existe plus. Si le text en comporte moins, je voudrais afficher juste la 1ere phrase...

Quel fonction php me permet de faire ceci.

Merci

Ps: J'avais pour idée de rechercher le 3eme point ou le 1er. Mais je ne sais pas comment faire.

Posté : 27 juin 2007, 13:32
par sadeq
Bonne idée tu te référe aux points pour délimter tes phrases. Le plus simple est de couper ton texte en parties séparées par des points en les rangeant dans un tableau.
En suite tu compte les lignes du tableau pour appliquer tes règles.

La fonction PHP qui coupe un texte en partie séparées par un caractère connu est explode()
Exemple:
$texte = "1° phrase. 2° phrase. 3° phrase.";
$phrases = explode(".", $texte); //retourne un tableau de phrases issues du découpage de $texte au niveau des points

//afficher
print_r($phrases);
Je te laisse la suite.

Posté : 27 juin 2007, 13:32
par Ryle
Il n'y a pas de fonction toute prête pour cela. Tu peux effectivement jouer sur la ponctuation en recherchant les points (à voir également les points d'exclamation ou d'interrogation) en utilisant substr() pour tronquer la chaine, et strpos() pour déterminer la position d'un caractère dans la chaine.
Tu peux ainsi savoir ou couper pour obtenir ta première phrase et éventuellement recommencer l'opération sur l'autre partie de la chaine pour avoir les suivantes :)

Posté : 27 juin 2007, 13:38
par bartz
Ok,

Merci pour les infos...


A plus

Posté : 27 juin 2007, 14:34
par bartz
Salut,

Alors voila ma fonction mais j'ai un souci:
function simplifie($texte){

$phrase=split("\?+|!+|\.+",$texte);

$lg= count($phrase);//longueur du tableau crée

if($lg >0){
	if($lg>3){
		return $phrase[0].". ".$phrase[1].". ".$phrase[2];
	}
	else{
		return $phrase[0].".";
	}
}
}
$text=simplifie("dfegfbre?    babar? lriguhre... titi........................... dfguih!!!!!!!!!!!! rere gt . iughrer! ggy. ig???? regiz.. regjkvbg? reo. iou fhrft ret rebgr. eigfurhefoir gfiarogf. egi regyg ro_gfrereyg. reghreot grtoreg. rfg reoreg zeoy_g.");
echo $text;
en fait si je teste avec ceci;
simplifie("tot.titi.tutu?figh ? fg zeruye????? fhgb erg ..... lrig zrey "), ca me renvoie bien tot.titi.tutu
mais si je teste avec

simplifie(tot?titi.tutu.fgjkfg?dfghf gd???fdgigh ") ca me renvoie tot.titi.tutu

je ne sais pas comment faire pour que cela me renvoie bien tot?titi.tutu

Merci

Posté : 27 juin 2007, 15:09
par sadeq
Hé oui, c'est dù au fait que dans la fonction simplifie() tu concaténe toujours avec les points.
La difficulté réside dans le fait que tu ne sait pas pour une phrase X quel délimiteur a été rencontré pour couper 2 phrases.

La solution est d'utiliser preg_split() avec le flag : PREG_SPLIT_DELIM_CAPTURE (version >= PHP 4.0.5)
tout en entourant les délimiteurs recherchés entre () comme ça cette fonction retourne à la fois les phrases découpées et les démimiteurs rencontrés.

Exemple:
<?php
$texte = "1° phrase! 2° phrase? 3° phrase."; 
$phrases = preg_split("/(\?)+|(!)+|(\.)+/", $texte,-1, PREG_SPLIT_NO_EMPTY+PREG_SPLIT_DELIM_CAPTURE); 

//afficher 
print_r($phrases);
?>
Mais fait attention au nouveau compte des phrases. :wink:

Posté : 27 juin 2007, 15:52
par bartz
Ok,

je vais tester cela de suite.

Merci beaucoup.

Posté : 27 juin 2007, 16:02
par bartz
Alors, j'ai testé, cela fonctionne assez bien, sauf que si jamais j'ai toto???titi.tutu cela me renvoie toto? titi.tutu

Posté : 27 juin 2007, 16:27
par sadeq
Il suffit de mettre aussi les + dans les () dans l'expression régulière, car le + ou * représentent les occurences possibles du caractère recherché.
Exemple:
<?php
$texte = "1° phrase!! 2° phrase?? 3° phrase..."; 
$phrases = preg_split("/(\?+)|(!+)|(\.+)/", $texte,-1, PREG_SPLIT_NO_EMPTY+PREG_SPLIT_DELIM_CAPTURE); 

//afficher 
print_r($phrases);
?>