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

bartz
Invité n'ayant pas de compte PHPfrance

27 juin 2007, 13:15

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.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2007, 13:32

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.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 juin 2007, 13:32

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

bartz
Invité n'ayant pas de compte PHPfrance

27 juin 2007, 13:38

Ok,

Merci pour les infos...


A plus

bartz
Invité n'ayant pas de compte PHPfrance

27 juin 2007, 14:34

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2007, 15:09

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:
Modifié en dernier par sadeq le 27 juin 2007, 15:57, modifié 2 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

bartz
Invité n'ayant pas de compte PHPfrance

27 juin 2007, 15:52

Ok,

je vais tester cela de suite.

Merci beaucoup.

bartz
Invité n'ayant pas de compte PHPfrance

27 juin 2007, 16:02

Alors, j'ai testé, cela fonctionne assez bien, sauf que si jamais j'ai toto???titi.tutu cela me renvoie toto? titi.tutu

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2007, 16:27

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);
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène