IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Preg_replace to preg_replace_callback


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 39
    Points
    39
    Par défaut Preg_replace to preg_replace_callback
    Bonjour

    Aprés la mise a jour de php de mon hebergeur j'ai du rencontrer beaucoup de probléme avec mon siteweb parmi ces probléme, utliser preg replace callback a la place de preg replace
    Aprés plusieurs tentative j'ai pas pu regler le problème, comment serait l'écriture correcte de ces codes??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tmp = preg_replace_callback("#(\s|^)((?:[\w\.~-]*?)@(?:.*?))((?:\.)?(\s|$|\[|\())#i","$1<a href=\"mailto:$2\">$2</a>$3",$tmp);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tmp = preg_replace_callback("#(\s|^)(\w{3,8}://.*?)((?:\.)?(\s|$|\[|\())#is","$1<a href=\"$2\" target=\"blank\">$2</a>$3",$tmp);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tmp = preg_replace_callback("#(\s|^)(www\..*?)((?:\.)?(\s|$|\[|\())#is","$1<a href=\"http://$2\" target=\"blank\">$2</a>$3",$tmp);
    Merci d'avance

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 905
    Points : 6 694
    Points
    6 694
    Par défaut
    Il n'y a aucune raison de remplacer preg_replace par preg_replace_callback si tes patterns n'utilisent pas le modificateur e.

    Si le cas se présente, la procédure est décrite sur cette page du manuel PHP. Tu peux également jeter un œil sur la page de preg_replace_callback pour bien comprendre en quoi consiste cette fonction.

    Mais pour ce que tu tentes de faire, preg_replace_callback n'est pas nécessaire, sauf si par exemple, tu veux tester au passage la validité des URLs ou des mails avant des les transformer en liens.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Voilà le message que j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tmp = stripslashes(preg_replace("#" . $srch . "#isSe" . $options,$repl,$tmp));
    D'où vient le probléme

    merci d'avance

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 905
    Points : 6 694
    Points
    6 694
    Par défaut
    Si tu ne lis ni les messages d'erreurs, ni le manuel ni les réponses qu'on te donne, on ne peut pas t'aider plus.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    merci pour tes réponse sinon j'ai lu ce que tu m'avais donné, si j'avais une solution a mon problème je ne viendrai pas t’embêter l'ami

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 905
    Points : 6 694
    Points
    6 694
    Par défaut
    Ah tu as changé ton message.

    $tmp = stripslashes(preg_replace("#" . $srch . "#isSe" . $options,$repl,$tmp)); est plutôt vague si on ne connaît pas les valeurs des variables.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Donc l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead ....php on line 395
    Voilà la fonction compléte: l'erreur descendre jusqu'a la ligne 143
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    // Fonction qui transforme les BBCode en HTML
    	function renderBBCode (&$str) {
    		// Je rend les tableaux de paramètres disponibles
    		// à ma fonction
    		global $bbTags;
    		global $htmlTags;
     
    		// Je parse les BBCode pour leur attribuer un id unique
    		$tmp = parseBBTags($str);
    		// Pour chaque tag BBCode de mes aramètres HTML
    		reset($htmlTags);
    		while (list ($key, $val) = each ($htmlTags)) {
    			// Je récupère le nom et les propriétés de mon tag
    			$curtagname = $key;
    			$curtagprops = $val;
    			// Si c'est un tag avec paramètres, je dois enlever
    			// le '-param' qui est à la fin.
    			if ($curtagprops["param"] == "yes") {
    				$curtagname = substr($curtagname,0,-6);
    			}
    			// Il s'agit maintenant de générer l'expression régulière ... :D
    			//  - before : regexp pour un contenu éventuel AVANT le tag
    			//  - tagsrch : regexp pour le tag lui-même
    			//  - contsrch : regexp pour le contenu du tag
    			//  - endsrch : regexp pour le tag de fermeture
    			//  - after : regexp pour un contenu eventuel APRES le tag de fermeture
    			$before = "";
    			$tagsrch = "\[" . preg_quote($curtagname);
    			$contsrch = "(.*?)";
    			$endsrch = "";
    			$after = "";
     
    			// Idinces des regexp
    			//  - idind : Indice dans la regexp de l'ID du tag (utile pour les références arrières)
    			//  - contind : Indice du contenu du tag
    			//  - paramind : Indice du paramètre du tag (s'il en faut un)
    			$idind = 0;
    			$contind = 1;
    			$paramind = 0;
     
    			// Chaine de remplacement
    			//  - beforerepl : Debut de la chaine de remplacement
    			//  - repl : Remplacement
    			//  - afterrepl : Fin de la chaine de remplacement
    			$beforerepl = "";
    			$repl = "";
    			$afterrepl = "";
     
    			// Il s'agit de donner les bonnes valeurs aux indices et regexp maintenant
    			// SI le tag prend un paramètre
    			if ($curtagprops["param"] == "yes") {
    				// On rajoute le paramètre à la regexp du tag d'ouverture
    				$tagsrch .= "(?:=(.*?))";
    				// Le parametre a un indice
    				$paramind++;
    				// Du coup, l'ID et le contenu sont un cran plus loin
    				$idind++;
    				$contind++;
    			}
    			// Si le tag doit être fermé, il a un ID
    			if($curtagprops["close"] != "no") {
    				// On rajoute l'ID à la regexp du tag d'ouverture
    				$tagsrch .= "(:[0-9a-z]{10})";
    				// Du coup, l'ID a un indice
    				$idind++;
    				// Et le contenu est encore décalé d'un cran
    				$contind++;
    				// Le tag de fermeture doit être recherché avec le meme ID
    				// que celui d'ouverture
    				$endsrch = "\[/" . preg_quote($curtagname) . "\\" . $idind . "\]";
    			} else {
    				// Si le tag n'a pas de fermeture, on ne peut pas trouver de "contenu"
    				$contsrch = "";
    			}
    			// On rajoute le crochet de fin du tag d'ouverture
    			$tagsrch .= "\]";
    			// Si le tag doit avoir un parent, on s'assure qu'il est dans ce parent
    			if ($partag = $curtagprops["parent"]) {
    				// On cherche le tag parent d'ouverture AVANT le tag
    				$before = "(\[" . preg_quote($partag) . "(?:=.*?)?(:[0-9a-z]{10})\].*?)";
    				// Et on cherche la tag prent de fermeture APRES le tag
    				$after = "(.*?\[/" . preg_quote($partag) . "\\2\])";
    				// Du coup, le contenu est décalé de 2 cran : tag parent d'ouverture
    				// + ID du tag parent d'ouverture
    				$contind += 2;
    				// Pareil pour l'ID
    				$paramind += 2;
    				$idind +=2;
    				// On remet les tags parent avant et aprés dans la chaine de remplacement
    				$beforerepl = "$1";
    				$afterrepl = "$" . ($contind+1);
    			}
    			// Maintenant que tous les indices de position sont bons, on peut chercher
    			// le tag de fermeture (si besoin est)
    			if($curtagprops["close"] != "no") {
    				// Le tag de fermeture doit être recherché avec le meme ID
    				// que celui d'ouverture
    				$endsrch = "\[/" . preg_quote($curtagname) . "\\" . $idind . "\]";
    			}
    			// On remplace les valeurs {PARAM} et {VALUE} qui peuvent apparaître
    			// dans le HTML de remplacement. {PARAM} ets remplacé par le paramètre
    			// du tag BBCode, et {VALUE} par son contenu
    			// On en profite pour commencer la chaine de remplacement par le HTML de debut
    			$repl = "'" . $curtagprops["begin"] . "'";
    			$repl = str_replace("{VALUE}", "$" . $contind,$repl);
    			if ($paramind > 0) {
    				$repl = str_replace("{PARAM}","$" . $paramind,$repl);
    			} else {
    				$repl = str_replace("{PARAM}","",$repl);
    			}
     
    			// Si on veut garder le contenu entre le HTML de début et le HTML de fin
    			if ($curtagprops["keep"] != "no") {
    				// Si le contenu doit être parsé par une fonction, on y fait appel
    				if ($curtagprops["function"]) {
    					$repl .= " . " . $curtagprops["function"] . "(\"$" . $contind . "\")";
     
    				// Sinon, on affiche tout simplement le contenu (grace a son indice
    				// trouvé plus haut)
    				} else {
    					$repl .= " . '$" . $contind . "'";
    				}
    			}
    			// On finit la chaine de remplacement par le HTML de fin
    			$repl .= " . '" . $curtagprops["finish"] . "'";
     
    			// On assemble la chaine de remplacement
    			$repl = "'" . $beforerepl . "' . " . $repl . " . '" . $afterrepl . "'";
     
    			// On assemble la regexp
    			$srch = $before . $tagsrch . $contsrch . $endsrch . $after;
     
    // Affichage de debug, affiche la regexp et le pattern de remplacement
    // si la regexp n'est pas trouvée
    //			if (!preg_match("#" . $srch . "#isS", $tmp)) {
    //				echo $srch . " => " . htmlspecialchars($repl) . "<br />\n";
    //			}
    			// A cause de l'imbrication éventuelle des tags, on effectue
    			// le remplacement jusqu'à ce qu'il n'y ai plus de tag à remplacer.
    			while (preg_match("#" . $srch . "#isS",$tmp)) {
    				// Le stripslashes élimine les quelques antislah qui ont pu se glisser
    				// à cause du preg_quote.
    	//line 395
    			$tmp = stripslashes(preg_replace("#" . $srch . "#isSe" . $options,$repl,$tmp));
    			}
    		}
     
    		// Si jamais il reste des tags avec id qui n'ont pas été remplacés
    		// on enlève l'id. Le pricipe de recherche est le même que pour parseBBTags
    		$srch = "";
    		for($i=0 ; $i<count($bbTags) ; $i++) {
    			$srch .= preg_quote($bbTags[$i]) . "|";
    		}
    		$srch = substr($srch,0,-1);
    		$srch = "(\[(?:/)?(?:" . $srch . ")(?:=(?:.*?))?)(?::[0-9a-z]{10})(\])";
    		$tmp = preg_replace("#" . $srch . "#i","$1$2",$tmp);
    		// Je retourne la chaine obtenue
    		return $tmp;
    	}
    Merci d'avance

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 905
    Points : 6 694
    Points
    6 694
    Par défaut
    Oula, ça fait peur!

    Bon tu as deux solutions:
    • La plus raisonnable et pérenne: tu vires ce parser et tu utilises à la place une classe comme jBBCode pour faire le boulot. (Fait toi un script de test dans un premier temps pour voir comment ça fonctionne et pour adapter ta syntaxe de BBCode, puis quand c'est concluant inclus le dans ton projet.). Je ne te conseille pas l'extension BBCode de PHP qui est à l'abandon depuis au moins 7 ans.
    • Autre solution de type "rustine": poste le contenu de tes variables appelées en global dans ta fonction ($bbTags et $htmlTags) pour voir ce que l'on peut faire. (Néanmoins mon petit doigt me dit que ce modificateur e est tout simplement inutile, retire le et fait des tests pour voir.)

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    en fait une simple suppression de ce e rend l'affichage des texte bordélique, il y a des guillemets partout des virgules bref peut étre que je vais l'enlever carrément

    merci pour tes réponses

Discussions similaires

  1. [PHP 5.5] preg_replace remplacé par preg_replace_callback
    Par nemox31 dans le forum Langage
    Réponses: 1
    Dernier message: 22/10/2015, 22h13
  2. [RegEx] transformer un preg_replace en preg_replace_callback (migration)
    Par le korrigan dans le forum Langage
    Réponses: 8
    Dernier message: 23/07/2015, 11h37
  3. [RegEx] problème avec preg_replace
    Par carlos20 dans le forum Langage
    Réponses: 6
    Dernier message: 27/10/2005, 10h29
  4. [RegEx] Preg_replace et affichage de variable
    Par xperienss dans le forum Langage
    Réponses: 6
    Dernier message: 13/10/2005, 13h26
  5. [RegEx] preg_replace : explications sur les caractères spéciaux
    Par Anduriel dans le forum Langage
    Réponses: 6
    Dernier message: 05/10/2005, 21h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo