Page 1 sur 1

Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 01:47
par Anémone
Bonjour,

J'édite un texte de 380 caractères suceptible de finir par &, &e, &eacute etc. Pour remédier à cet inconvénient, j'ai imaginé de tester les 7 derniers caractères de ma chaîne, avec l'idée de n'éditer que 372 caractères à mon texte si le symbole & se rencontre parmi ces 7 caractères. J'ai ainsi codé:
$src = substr($src, 0, 380);

$bad_caracter=explode($substr($src,370, 7));
$i=1;
while($i<7)
{if($bad_caracter[$i]='&')
{$texte=substr($src,0, 372);
}

else { $texte=$src;}
$i++;
}
echo $texte
et je 'édite toujours 380 caractères même si & est l'un des 7 derniers caractères.
Merci d'avance de m'éclairer.
Bien cordialement,

Thierry

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 02:33
par Dr@ke
// $src = html_entity_decode($src);
// $scr = htmlspecialchars($src);
$src2 = substr($src, 0, 387);
$fin = substr($src2, -14);

if (preg_match("/&/", $fin)) {
    // $decode = htmlspecialchars_decode($fin);
    $decode = html_entity_decode($fin);
    $debut = substr($src2, 0, -14);
    $texte = $debut . $decode;
    if (strlen($texte) > 380) {
        $texte = substr($texte, 0, 380);
    }
}
else {
    $texte = substr($src, 0, 380);
}
echo $texte;
tu pourrais faire comme cela?
(je n'ai pas testé, donc peut-être des erreurs, mais en gros c'est une autre piste)

PS: je n'ai vraiment pas testé, donc outres les erreurs possibles du code, faudra s'assurer que le texte original est bien convertit à la base avec htmlentities sinon -> bugs à profusion...

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 13:30
par Anémone
Bonjour,

Et merci, je vais essayer ça.
Par contre, je ne vois pas de raison logique à ce que mon code ne fonctionne pas...
Cordialement,


Thierry

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 13:36
par Dr@ke
Ok, mais je viens de relire mon petit bout de code, il y a quelques erreurs, il était tard hier soir :wink:
Faut notamment tester le caractère & avec preg_match avec la chaine de 380 caractère et non de 387...
Et ensuite, si oui, déconvertir la chaine de 387 caractères...
Sinon en gros l'idée c'est surtout de déconvertir le texte si preg_match détecte la présence du caractère &...

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 14:19
par Berzemus
Pourquoi ne pas utiliser preg_replace ?

Si je comprends bien, tu extrais une sous-chaine susceptible de contenir (en entier ou en partie) &eacute; en fin de chaine, et tu voudrais le supprimer.

Dans ce cas-la, un regex tel que celui-ci devrait faire l'affaire:
$bon_extrait = preg_replace("#&(e(a(c(u(t(e(;)?)?)?)?)?)?)?$#i","",$extrait);
Ainsi, tout &eacute (ou partie de &eacute) situé en fin de chaine sera retiré.

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 14:27
par Dr@ke
C'est son idée de départ, bien que ta méthode est meilleur.
Mais je pense que cela va créer des incohérences dans le texte -> supprimer un é...
Donc au lieu de le supprimer, je pensais qu'il était au pire préférable de le convertir.
Ensuite le caractère ; dans le preg_replace est inutile je pense, car si il est en entier, alors le problème ne se pose plus.
Si j'ai bien compris son soucis, c'est de découper un texte de 380 caractères avec le risque de découper &eacute; et donc d'avoir une incohérence dans le résultat...

[EDIT]
Le problème pouvant donc se poser avec un autre caractére que &eacute;.
La présence de &eacute; souligne que le texte est convertit avec htmlentities.
La solution serait de déconvertir et reconvertir avec htmlspecialchars...
(Vue que dans différents Topics, il est apparue que la conversion des caractères accentués est quasiment inutile)...

Donc cela complique la création d'une Reg pouvant fonctionner à tous les coups, à par la recherche du seul caractère: &...

Je pensais donc que la meilleur solution était de déconvertir au lieu de supprimer, mais c'est possible que je me trompe sur ce point...

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 14:57
par FuZZyLine
Salut,
[*]
Bonjour,
J'édite un texte de 380 caractères suceptible de finir par &, &e, &eacute etc. Pour remédier à cet inconvénient, j'ai imaginé de tester les 7 derniers caractères de ma chaîne, avec l'idée de n'éditer que 372 caractères à mon texte si le symbole & se rencontre parmi ces 7 caractères. J'ai ainsi codé:
et je 'édite toujours 380 caractères même si & est l'un des 7 derniers caractères.
Merci d'avance de m'éclairer.
Bien cordialement,
[*]Thierry
Il me semble que c'est ce que tu recherches:
<?php
   // Chaine exemple comprenant tout un tas de bétises
   // et plein de codes accents
   //
   $stringTest = "";

   $stringTest .= "Hello la france et les fran&ccedil;aises. ";
   $stringTest .= "Amiti&eacute;s sinc&egrave;res. Test:&eacute;";

   // Pattern de recherche
   //
   $pattern = "#(^.*?)(&\C{0,7})$#Uims";

   // Fonction basique de recherche/remplacement
   //
   $txt = preg_replace($pattern, "$1", $stringTest);

   // Affiche l'exemple un peu bête sans modif
   //
   echo "Original : ".$stringTest."<br>";

   // Le résultat... En espérant que ce soit ce que tu veux
   //
   echo "Modified : ".$txt;
?>
Il eut été plus facile de faire une recherche avec " & ET ; " en forme de délimiteurs mais...
J'ai crus comprendre que la fin de comprenait pas de " ; ". D'autre part, tu as mentionné 7 caractères
possibles: 8 ou + ne marcheraient pas sans modifier le pattern alors attention.

Testé: ca marche !

Et pour finir: Super rentable ce type de trucs à faire. 10 minutes d'Expressions Rationnelles équivalent
à 2 deux heures de Soduku je suis sur ;)

@+ bon code ;)

PS: Malin, j'ai cru que t'étais une fille... pfff...;)

EDIT: @Berzemus : Encore grillé... qu'est-ce que je suis lent, moi !

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 15:04
par Berzemus
Dés qu'on veut s'étendre au-delà de certains cas spécifiques, c'est clair que c'est plus dur... :mrgreen:

Pourquoi ne pas éviter la problématique dans son entier et faire une recherche du premier espace blanc suivant (ou précédent) le caractère #380 (si celui-ci n'est pas un espace blanc, ou une ponctuation, ou autre chose sans grand intérêt), et extraire la sous-chaine jusqu'à cet espace blanc ? C'est plus propre et vite fait.

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 15:07
par Dr@ke
Oui t'as raison, car faut garder à l'esprit que le caractère & peut être présent aussi pour d'autres raisons que la conversion htmlentities...

[EDIT]
Sinon ton système de recherche à l'air très bien Fuzzyline.
Par contre, je n'ai pas compris par quoi il remplace les caractères...
Peux tu m'expliquer?

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 16:30
par Anémone
Bonjour à tous,

et merci pour toutes ces réponses.
Je reviens là-dessus dans le WE, espérant bien mettre un "résolu" à mon prochain message sur le sujet!
Cordialement,

Paulette :D

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 24 sept. 2009, 16:46
par Dr@ke
Il est possible que l'on se complique la vie pour rien.
Tout dépend ce que tu veux faire exactement.

Mais le plus safe serait:
<?php
function decoupe_src($src, $taille) {  // $taille -> nombre de caractères
    $src = html_entity_decode($src);
    $src = substr($src, 0, $taille);
    $src = htmlentities($src);         // ou $src = htmlspecialchars($src);
    return $src;
}
echo decoupe_src($src, 380);           // Exemple d'utilisation avec echo() avec 380 caractères
?>

Re: Pour éviter qu'un texte finisse par &e ou &eacute...

Posté : 26 sept. 2009, 22:56
par Anémone
Dés qu'on veut s'étendre au-delà de certains cas spécifiques, c'est clair que c'est plus dur... :mrgreen:

Pourquoi ne pas éviter la problématique dans son entier et faire une recherche du premier espace blanc suivant (ou précédent) le caractère #380 (si celui-ci n'est pas un espace blanc, ou une ponctuation, ou autre chose sans grand intérêt), et extraire la sous-chaine jusqu'à cet espace blanc ? C'est plus propre et vite fait.
Bien sûr, bien vu, ça marche!
Merci,

Thierry