2010-08-17 3 views
3

Je ne peux pas comprendre cela, pour une raison quelconque ceci:Pourquoi preg_replace donne cette sortie?

$string = "#mainparent { 
position: relative; 
top: 100px; 
left: 100px; 
width:4994px; 
}"; 

$elementwidth = "88"; 

    $re1='(.*?)'; # Non-greedy match on filler 
    $re2='(mainparent)'; # Word 1 
    $re3='(.*)'; # Non-greedy match on filler 
    $re4='(width:)'; 
    $re5='(.*)'; # Word 2 
    $re6='(;)'; # Any Single Character 1 
$pattern="/".$re1.$re2.$re3.$re4.$re5.$re6."/s"; 
    $replacement= '$1'.'$2'.'$3'. '$4'. $element_width .'$6'; 
    $return_string = preg_replace_component ($string, $pattern, $replacement); 
    #c} 

    echo $return_string; return; 

sortie ce (ci-dessous), je ne peux pas comprendre pourquoi il remplace la « largeur » en fonction de la façon dont je l'ai mis it up .. des conseils est apprécié

#mainparent { position: relative; top: 100px; left: 100px; 88; } 
+1

Qu'est-ce que 'preg_replace_component()'? Une fonction personnalisée vous avez construit? – animuson

+0

Il y a une meilleure façon de faire cela. C'est ce qu'on appelle [LESS] (http://lesscss.org/) – NullUserException

Répondre

5

le problème est que votre chaîne de remplacement ressemble à ceci:

'$1$2$3$488$6' 
     ^^^ 

Parce que le caractère suivant immédiatement le groupe n umber est un chiffre, il est interprété comme le groupe 48 au lieu du groupe 4.

Voir le manuel preg_replace "Exemple # 1 Utilisation de références arrières suivies de littéraux numériques". Le plus petit changement nécessaire pour le faire fonctionner est d'entourer le 4 par des accolades de sorte qu'il est séparé du 88.

$replacement = '$1' . '$2' . '$3'. '${4}'. $element_width . '$6'; 

Mais ce n'est pas une bonne façon de le faire et il y a aussi un certain nombre de problèmes avec votre code.

  • Les expressions régulières ne sont pas vraiment adaptées à l'analyse et à la modification de CSS.
  • D'abord vous écrivez $elementwidth et plus tard vous écrivez $element_width.
  • Il n'est pas nécessaire de créer 6 groupes différents si vous avez seulement l'intention de remplacer l'un d'entre eux.
+3

Sans oublier qu'il a utilisé "88" au lieu de "88px". Aussi, pourquoi était-ce downvoted? – animuson

+0

Hey Rick, c'est la bonne réponse. – buley

+0

son à partir d'un générateur regex qui est pourquoi il est dans les 6 groupes, oui j'ai fait une erreur avec le nom $ element_Width en le copiant sur ce post alors ce n'était pas le problème ... aussi loin que le "88" de "88px", ça n'a rien à voir là-dessus, je ne fais que tester ça ... pourquoi est-ce que ça change pour remplacer '(. *)'? – Rick

Questions connexes