Discussion:
un probleme avec preg_replace
(trop ancien pour répondre)
Newsgroups
2007-02-11 23:24:35 UTC
Permalink
bonjour,

je souhaite faire une chose relativement simple.. mais je tombe sur un
os !

En fait, je veux (simplement) remplacer la chaine suivante :
<?xml version="1.0" encoding="utf-8"?>

par celle ci :
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type=\"text/xsl\" href=\"".$xsl."\" media=\"screen\"?>


(avec 1.0 et utf-8 qui sont variables)

Donc, j'ai fais comme ceci :
$contents = preg_replace("/<?xml version=\"(.*?)\" encoding\"(.*?)\"?>/i", "<?xml version=\"$1\" encoding=\"$2
\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"".$xsl."\" media\"screen\"?>", $contents);

Mais le résultat est le suivant :
<?<?xml version="1.0" encoding="UTF-8" ?"?>
<?xml-stylesheet type="text/xsl" href="ma variable $xsl" media="screen"?>

Donc le probleme est au niveau de la première ligne, où il me rajoute 2 fois <? et 2 fois ?>

Je pensais que ce probleme venait des ? de ma regexp, car ce sont des caractères spéciaux, mais il ne match plus la regexp si le les échappe.

Je veux bien un coup de main svp. :-)
Olivier Miakinen
2007-02-12 00:09:39 UTC
Permalink
Post by Newsgroups
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type=\"text/xsl\" href=\"".$xsl."\" media=\"screen\"?>
(avec 1.0 et utf-8 qui sont variables)
$contents = preg_replace("/<?xml version=\"(.*?)\" encoding\"(.*?)\"?>/i", "<?xml version=\"$1\" encoding=\"$2
\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"".$xsl."\" media\"screen\"?>", $contents);
Note que /<?xml/ peut retrouver '<xml' ou 'xml' mais certainement pas
'<?xml'. Idem pour /\"?>/ qui peut retrouver '">' ou '>' mais pas '"?>'.
Du coup, avec /\"(.*?)\"?>/ les parenthèses capturantes te mettront
'utf-8"?' dans $2.
Post by Newsgroups
<?<?xml version="1.0" encoding="UTF-8" ?"?>
<?xml-stylesheet type="text/xsl" href="ma variable $xsl" media="screen"?>
J'en déduis que tu devais avoir une espace entre '"UTF-8"' et '?>',
n'est-ce pas ?
Post by Newsgroups
[...]
Je pensais que ce probleme venait des ? de ma regexp, car ce sont des
caractères spéciaux,
Tu pensais bien, mais ce problème principal en masquait un autre, celui
de l'espace en plus non prévue.
Post by Newsgroups
mais il ne match plus la regexp si le les échappe.
Normal.
Post by Newsgroups
Je veux bien un coup de main svp. :-)
Je veux bien t'en donner un, si tu me promets de :
1) régler ton nouvelleur pour qu'il envoie des lignes de longueur
raisonnable (bien moins de 80 caractères, s'il te plaît) ;
2) ajouter .invalid à ton adresse si elle est invalide (mais ne tiens
pas compte de cette remarque si tu as vraiment l'adresse newsgroups
chez free.fr).
:-)

Bon, allez, je ne suis pas chien. Voilà :

$plus = "<?xml-stylesheet type='text/xsl' href='$xsl' media='screen'?>";
$contents = preg_replace('/(<\?xml.*\?>)/Ui', "$1\n$plus", $contents);

Mais essaye quand même de tenir compte de mes demandes...
Newsgroups
2007-02-12 20:48:18 UTC
Permalink
Post by Olivier Miakinen
J'en déduis que tu devais avoir une espace entre '"UTF-8"' et '?>',
n'est-ce pas ?
Probable, en effet...
Post by Olivier Miakinen
Tu pensais bien, mais ce problème principal en masquait un autre, celui
de l'espace en plus non prévue.
ok
Post by Olivier Miakinen
1) régler ton nouvelleur pour qu'il envoie des lignes de longueur
raisonnable (bien moins de 80 caractères, s'il te plaît) ;
Je n'ai pas cette option, mais il me semble qu'il le fait par défaut à
une longueur raisonnable ; sauf lors de mon copier-coller sur la ligne
de code. :-)
Post by Olivier Miakinen
2) ajouter .invalid à ton adresse si elle est invalide (mais ne tiens
pas compte de cette remarque si tu as vraiment l'adresse newsgroups
chez free.fr).
:-)
ok, j'en prends note, et je fais la modif pour les prochains
message. :-) A vrai dire, j'y pense.. et puis j'oublie.. c'est la, c'est
la vie. :-)
Post by Olivier Miakinen
$plus = "<?xml-stylesheet type='text/xsl' href='$xsl' media='screen'?>";
$contents = preg_replace('/(<\?xml.*\?>)/Ui', "$1\n$plus", $contents);
Bon, jvais aller chercher dans la doc pour la signification du
modificateur "U"
Post by Olivier Miakinen
Mais essaye quand même de tenir compte de mes demandes...
c'est noté. :-)
Olivier Miakinen
2007-02-12 22:00:01 UTC
Permalink
Post by Newsgroups
Post by Olivier Miakinen
J'en déduis que tu devais avoir une espace entre '"UTF-8"' et '?>',
n'est-ce pas ?
Probable, en effet...
Plus que probable : l'espace s'est retrouvée copiée en même temps que
les guillemets.
Post by Newsgroups
Post by Olivier Miakinen
1) régler ton nouvelleur pour qu'il envoie des lignes de longueur
raisonnable (bien moins de 80 caractères, s'il te plaît) ;
Je n'ai pas cette option,
En effet, je n'ai rien trouvé dans la doc :
http://www.gnome.org/projects/evolution/doc/evolution26.pdf
Post by Newsgroups
mais il me semble qu'il le fait par défaut à
une longueur raisonnable ; sauf lors de mon copier-coller sur la ligne
de code. :-)
Cet article auquel je réponds est correct, en effet. Mais dans le
précédent il y avait plusieurs lignes trop longues, et pas seulement
celles copicollées.
Post by Newsgroups
Post by Olivier Miakinen
2) ajouter .invalid à ton adresse si elle est invalide (mais ne tiens
pas compte de cette remarque si tu as vraiment l'adresse newsgroups
chez free.fr).
:-)
ok, j'en prends note, et je fais la modif pour les prochains
message. :-) A vrai dire, j'y pense.. et puis j'oublie.. c'est la, c'est
la vie. :-)
Fais-le *avant* de me répondre, ce coup-ci ! Par ailleurs, si jamais
l'un de tes articles devait être refusé dans ce groupe, tu n'en sauras
jamais la raison si tu n'as pas une adresse valide, au moins en Reply-To.
Post by Newsgroups
Post by Olivier Miakinen
$plus = "<?xml-stylesheet type='text/xsl' href='$xsl' media='screen'?>";
$contents = preg_replace('/(<\?xml.*\?>)/Ui', "$1\n$plus", $contents);
Bon, jvais aller chercher dans la doc pour la signification du
modificateur "U"
Bonne idée, parce que tu peux y trouver aussi d'autres options
intéressantes. Mais pour ce point particulier je peux te répondre :
/machin .* truc/U est équivalent à /machin .*? truc/ (et vice versa).

Cordialement,
--
Olivier Miakinen
Continuer la lecture sur narkive:
Loading...