OVH Cloud OVH Cloud

un probleme avec preg_replace

3 réponses
Avatar
Newsgroups
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. :-)

3 réponses

Avatar
Olivier Miakinen

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);


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.

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"?>


J'en déduis que tu devais avoir une espace entre '"UTF-8"' et '?>',
n'est-ce pas ?

[...]

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.

mais il ne match plus la regexp si le les échappe.


Normal.

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', "$1n$plus", $contents);

Mais essaye quand même de tenir compte de mes demandes...

Avatar
Newsgroups
J'en déduis que tu devais avoir une espace entre '"UTF-8"' et '?>',
n'est-ce pas ?


Probable, en effet...

Tu pensais bien, mais ce problème principal en masquait un autre, celui
de l'espace en plus non prévue.
ok


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. :-)


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. :-)


Bon, allez, je ne suis pas chien. Voilà :
$plus = "<?xml-stylesheet type='text/xsl' href='$xsl' media='screen'?>";
$contents = preg_replace('/(<?xml.*?>)/Ui', "$1n$plus", $contents);
Bon, jvais aller chercher dans la doc pour la signification du

modificateur "U"

Mais essaye quand même de tenir compte de mes demandes...
c'est noté. :-)


Avatar
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.

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

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.

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.

Bon, allez, je ne suis pas chien. Voilà :
$plus = "<?xml-stylesheet type='text/xsl' href='$xsl' media='screen'?>";
$contents = preg_replace('/(<?xml.*?>)/Ui', "$1n$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