Nettoyer une chaine (expr.Reg)

Eléphant du PHP | 428 Messages

06 juin 2012, 13:24

Bonjour,

Je ne parviens à trouver une bête solution pour nettoyer une chaine.
En fait, j'essaye de supprimer le http:// OU http://www d'une chaine.

Ex.: http://www.google.be doit donner : google.be et http://domaine.google.be doit donner : domaine.google.be

Pouvez-vous m'aider ?

Expression régulière ? Comment ?

Merci :)

Eléphant du PHP | 428 Messages

06 juin 2012, 13:32

Ah oui, J'ai testé ceci : mais cela ne fait rien : ^(http:\/\/|http:\/\/www)

ViPHP
ViPHP | 2577 Messages

06 juin 2012, 13:35

personnellement, j'utiliserai la fonction substr() pour découper la chaine de caractères en testant le début et en conservant la fin si le début contient les chaines recherchées.

Eléphant du PHP | 428 Messages

06 juin 2012, 13:50

Bonjour,

C'est bon, j'ai trouvé ... erreur de ma part pour l'expression régulière.
En effet en mettant comme masque le http:// en premier, la condition renvoyait toujours true.

Il faut donc procéder comme suit :
$subdom = preg_replace("/^(http:\/\/www.|http:\/\/)/", "", $url);
Exemple :
- Pour la chaine http://domaine.google.be, cela renvoie (domaine.google.be)
- Pour la chaine http://www.google.be, cela renvoie (google.be)

Donc plus pratiquement si on veut tester l'existence d'un sous domaine, il faut faire un explode comme suit :
$subdom = preg_replace("/^(http:\/\/www.|http:\/\/)/", "", $url);
$subdom = explode('.', $subdom);

if (!empty($subdom[0])) {
            $subdom = $subdom[0];
        } else {
            $subdom = 'N/A';
        }
Merci,
Raph

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

06 juin 2012, 13:50

Bah l'expression régulière est bien plus pratique, tu n'es d'ailleurs pas loin... Si toutes tes chaines commencent par http://, tout ce que tu as à vérifier ensuite c'est la présence ou non de la chaine "www." : ^http:\/\/(www\.)?
echo preg_replace("#^http:\/\/(www\.)?#", "", $taChaine);
Tu peux même ajouter un contrôle sur les url sécurisées avec un "http(s)?"
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 428 Messages

06 juin 2012, 13:53

Merci Ryle ! Comment vas tu depuis le temps ?

ViPHP
ViPHP | 1380 Messages

06 juin 2012, 17:21

Assez d'accord avec Ryle, quand on a la flemme de construire une solution sur les fonctions de chaîne les regex sont bien pratiques.

Une petite suggestion d'optimisation: les parenthèses de la partie optionnelle www ne doivent pas être capturantes. On gagne à peu près 30% en les rendant non-capturantes.
http://lumadis.be/regex/test_regex.php?id=1187

Il n'est pas nécessaire non plus d'échapper les //. On ne gagnera rien en performance en les supprimant mais en lisibilité oui. ^_^
ripat