Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/05/2006, 20h52   #1
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Par défaut Tronquer une chaine de caractère sauf si c'est une URL.

Bonjour,

J'ai un petit souci : Je dois tronquer les chaines de caractères qui s'affichent sur la page, si celles-ci dépassent 26 caractères.
Pour ce faire, à la réception d'un formulaire, je tronque le contenu à l'aide de la fonction suivante :
Code :
1
2
3
4
5
 
$longueur = 26;
$caractere = ' '; 
$contenu= preg_replace('`([[:alnum:][:punct:]]{'.$longueur.'})`smU',
'$1'.$caractere,$contenu);
Cela fonctionne bien. Mais le problème c'est que je peux recevoir des URL via le form, et elles doivent fonctionner convenablement, donc ne pas être tronquées.
Je dois donc excepter de la fonction ci-dessus les urls. A priori il faudrait détecter celle-ci via <a href></a>.

Voyez-vous comment faire ?
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 21h00   #2
Membre confirmé
 
Avatar de riesseg
 
Inscription : mars 2006
Messages : 415
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 415
Points : 201
Points : 201
Envoyer un message via MSN à riesseg
tu test les premiers caracteres et si ils sont egales a http:// ou a www tu ne fais pas ta troncature
__________________
n'oubliez pas la balise
riesseg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 21h13   #3
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
Tu pourrais tester avec un :
Code :
eregi("http:\/\/www\..([a-z]+\.[a-z]{3}",$chaine,$split)
Si ca passe pas dis le moi lol, on fera avec preg_match :
Code :
preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split)
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 21h25   #4
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Oui alors je réfléchi à ce que vous me dites là. Par contre je me suis mal expliqué :

Si le gars me fait un copier/coller d'une url, je m'en fiche de la tronquer de toute façon elles ne réagissement pas aux clics à l'affichage.

Par contre sur mon éditeur de texte made in taïwan j'ai un bouton qui crée des liens avec libellé. Donc il apparait sur l'écran du visiteur un lien google et le <a href="http://www.google.fr"></a> ne se voit pas, c'est dans le code.
C'est ce <a href="......"> que je ne veux pas découper avant l'envoit dans la base.

**edit**
A priori y'a deux solutions : soit je détecte dans le contenu les <a href> et je les tronque pas.
Soit je les recolle après qu'elles aient été tronquées.
Reste à écrire la chose quoi...
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 21h34   #5
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
Ben dans l'expression régulière que je t'ai donné tu rajoutes juste le href et ca devrait etre bon, non ?
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 21h37   #6
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Sinon j'utiliserait preg_replace_callback() à ta place (je l'aime bien celui là).

Code :
1
2
3
4
5
6
7
8
9
10
function test_string($results) {
   if (substr($results[0], 0, 2) == "<a")
      return $results[0] // si c'est un lien on remplace par la même chose
   else
      return $results[0].$caractere; // sinon espace
}
 
$longueur = 26;
$caractere = ' '; 
$chaine = preg_replace_callback('`([[:alnum:][:punct:]]{'.$longueur.'})`smU', "test_string", $chaine);
Je trouve ça un peu trivial par contre non ?
Mais je me demand si c'est bien ça que tu veux ?
Edit: Mmm mon code ne doit pas fonctionner dans tous les cas... Est ce que tu pourrais même un exemple de chaine que tu récupères?
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 21h57   #7
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Citation:
Ben dans l'expression régulière que je t'ai donné tu rajoutes juste le href et ca devrait etre bon, non ?
Oui mais là je la pige pas ton expression régulière Kerod.

Citation:
Envoyé par Kerod
Tu pourrais tester avec un :
Code :
eregi("http:\/\/www\..([a-z]+\.[a-z]{3}",$chaine,$split)
Si ca passe pas dis le moi lol, on fera avec preg_match :
Code :
preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split)
En fait je dois faire ça ?
Code :
1
2
if(preg_match("#< href="http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split))
{qu'est ce que je marque dans l'instruction ? ;}
J'arrive pas à traduire en Français cette ligne en fait.

Citation:
Sinon j'utiliserait preg_replace_callback() à ta place (je l'aime bien celui là).
Avec plaisir si les autres confirment son utilité, parce que vu comment elle me parle cette fonction je préfère pas trop m'y frotter...

Un truc plus simple peut être :

Comment supprimer les espaces dans une chaine qui commence par <a href et termine par > ?

Pas de if ni rien là dedans, je devrais comprendre
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 22h16   #8
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
pour supprimer au début et à la fin c'est trim
à l'intérieur
Code :
explode(" ",$chain) ou $chain = str_replace(" ","",$chain);
pour explode tu dois récupérer les éléments du tableau pour les concaténer

Et pour le preg oui dans une condition if, et si c'est vrai les lignes dans ton seront effectué
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 22h32   #9
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Code :
explode(" ",$chain) ou $chain = str_replace(" ","",$chain);
Bon là encore, ça va. Ce bout de code n'occasionne pas chez moi de colisions neuronales trop invalidantes.

Maintenant comme j'ai peur de rien , j'ose la question suivante :

Comment c'est-y que j'isole de $contenu les $chain qui ressemble à des <a href ...> pour les passer en paramètre à explode ?

C'est atroce si je fais ça ?

$chain= preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split) ?

Et si pour tester si preg_match a renvoyé quelque chose, je fais, tenez vous bien :

Code :
1
2
3
if ($chain!="")
 
 {explode(" ",$chain) ou $chain = str_replace(" ","",$chain);}
Manque de pot en plus d'être idiot, ça prend pas les tableaux...
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 22h40   #10
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
Et plutot ca ?
Code :
1
2
3
4
if(preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split))
{
   $chaine = str_replace(" ","",$chaine);
}
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 22h52   #11
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Bein je vais me faire frapper, mais j'ai fait ça, et ça fonctionne pas, mon lien est tronqué dans la balise, ça donne <a href="www.google.fr/ladress delapage.php">google</a> :

Code :
1
2
3
4
5
6
7
8
 
<?php
$split=" ";
if(preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$contenu,$split))
{
   $contenu = str_replace(" ","",$contenu);
}
?>
Avec $contenu comme texte initial. D'ailleur je me demande si ce code, quand bien même il fonctionnerait pour un lien, fonctionnerait pour tous les liens du texte ?

**edit**
Ah dsl c'est peut être normal j'ai pas mis <a href devant http deux secondes je reviens.
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2006, 23h02   #12
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Non c'est zero, je suis nul en expression régulière, heuresement c'est pas ce qu'il ya de plus simple.

D'ailleur dans le truc je sais même pas comment écrire la chaine complète :

Code :
if(preg_match("#<a href=\"http:\/\/www\.([a-z]+\.[a-z]{3}\">)#",$contenu,$split))
J'ai fait ça pour prendre en compte le <a href devant http et le "> à la fin de la balise a, en échappant le tout avec des \ (oui je sais )

En plus tout ça c'est parce que la nouvelle version d'IE veut pas m'afficher mon overflow horizontal et que ça casse mes divs si y'a un texte trop long......

(y'en a qui vont morfler avec IE 7 question affichage, ça réserve des surprises. Mais bon on est sur le forum php là).
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2006, 16h09   #13
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Si j'ai bien suivi tu veux maintenant supprimer les espaces dans les liens? Genre:

Citation:
<a href="#">Un lien avec espace</a>
devient
<a href="#">Unlienavecespace</a>
Si c'est ça, ce code fonctionne chez moi:
Code :
1
2
3
4
5
6
function delete_spaces($results) {
   return "<a ".$results[1]." href='".$results[2]."' ".$results[3].">".
          str_replace(" ", "", $results[4]).
          "</a>";
}          
$str = preg_replace_callback("#\<a(.*)href\='([^']*)'(.*)>(.+)\<\/a\>#", "delete_spaces", $chaine);
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2006, 21h19   #14
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Salut Anduriel,

Non en fait je veux pas supprimer les espaces dans le texte du lien mais bien dans l'url :
Code :
1
2
3
<a href="http://www.une url.com/avec_esp aces">Un lien avec espace ou sans espace</a>
devient
<a href="http://www.uneurl.com/sans_espace">un lien avec espace</a>
En fait mon script va tout hacher, et c'est le but. Le texte du lien (qui apparait sur la page donc) doit aussi être hacher si nécessaire.
Mais après c'est l'url dans la balise qui risque aussi d'être hachée.
Et là c'est grave ==> le lien ne fonctionne plus. Il faut donc recoler les morceaux de l'url éventuellement découpée par le script de hachage, mais pas le texte du lien qui lui doit rester découpé.
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2006, 18h03   #15
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Tu modifies donc juste un peu la fonction. (Ce script est donc a utiliser après le pré-traitement sur la chaine):

Code :
1
2
3
4
5
6
function delete_spaces($results) {
   return "<a ".$results[1]." href='".str_replace(" ", "", $results[2])."' ".$results[3].">".
          $results[4].
          "</a>";
}          
$str = preg_replace_callback("#\<a(.*)href\='([^']*)'(.*)>(.+)\<\/a\>#", "delete_spaces", $chaine);

Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2006, 23h46   #16
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Je pige pas ton code Anduriel, je bosse jamais avec les fonctions, j'ai justement décidé de m'y mettre aujourd'hui .
Je peux pas utiliser un code que je comprend pas :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
function delete_spaces($results)
// à la place de $résult, je met le nom de la variable de contenu du formulaire ?
 {
   return "<a ".$results[1]." href='".str_replace(" ", "", $results[2])."' ".$results[3].">".
          $results[4].
          "</a>"; // c'est quoi ces $result[1], [2] etc...
}          
$str = preg_replace_callback("#\<a(.*)href\='([^']*)'(.*)>(.+)\<\/a\>#", "delete_spaces"//c'est quoi ça 
c'est pour appeler la fonction ou quoi?,
 $chaine//$chaine c'est le nom du contenu aussi ? 
alors c'était quoi le $result au dessus ? );
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2006, 12h01   #17
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Si tu veux connaitre les détails il faut voir la fonction preg_replace_callback() justement
Je t'explique:

Code :
$str = preg_replace_callback("#\<a(.*)href\='([^']*)'(.*)>(.+)\<\/a\>#", "delete_spaces", $chaine);
delete_spaces est une fonction vers laquelle renvoit cette expression régulière pour le remplacement de la chaine cherchée. Tu peux donc y placer des conditions, des traitements, et en fonction de ceux-ci remplacer par ce que tu veux. $chaine c'est tout simplement la variable dans laquelle se trouve le texte déjà formaté (par ta fonction qui place des espaces). Ma fonction delete_spaces est donc:

Code :
1
2
3
4
5
6
function delete_spaces($results)
{
   return "<a ".$results[1]." href='".str_replace(" ", "", $results[2])."' ".$results[3].">".
          $results[4].
          "</a>";
}
Par définition dans le manuel, la fonction vers laquelle est renvoyé le regex comporte un paramètre, tu lui donnes le nom que tu veux (ici $results). Cette variable contient dans un tableau tout ce que tu as récupéré dans les parenthèses capturantes du regex ($results[0] est tout ce qui a été récupéré, $results[1] la première parenthèse, $results[2] la deuxième etc).
Donc comme tu vois cette fonction retourne (return) un nouveau lien avec les options présentes dans les liens trouvés ($results[1], $results[3]), son texte ($results[4]) et enfin son adresse ($results[2]) qui est traitée de façon à remplacer les espace (" ") par rien ("").

Si t'as encore des problèmes dit le moi.
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h39.


 
 
 
 
Partenaires

Hébergement Web