OVH Cloud OVH Cloud

expression reguliere preg_replace

7 réponses
Avatar
thierry
bonjour,

ce n'est pas forcément propre à PHP mais je n'ai pas trouvé de réponse
ailleurs et comme je code en PHP je viens vers vous...

donc l'objectif, que j'ai atteint, était de supprimer les scripts d'une
page html.

la question qui me reste est
pourquoi la syntaxe suivante marche
$htmlPage = preg_replace("@<script[^>]*?>.*?</script>@si", '',
$htmlPage, -1);
alors que la syntaxe ci non:
$htmlPage = preg_replace("/<script[^>]*?>.*?</script>/si", '',
$htmlPage, -1);

donc la vraie question est quelle est la différence entre @ et /
dans la définition d'un masque pcre en PHP

merci d'avance

thierry

7 réponses

Avatar
m-e-
"thierry" a écrit dans le
message de news: 4451f7fc$0$2628$
[...]
la question qui me reste est
pourquoi la syntaxe suivante marche
$htmlPage = preg_replace("@<script[^>]*?>.*?</script>@si", '',
$htmlPage, -1);
alors que la syntaxe ci non:
$htmlPage = preg_replace("/<script[^>]*?>.*?</script>/si", '',
$htmlPage, -1);

donc la vraie question est quelle est la différence entre @ et
/
dans la définition d'un masque pcre en PHP


@ et / sont ici utilisés comme délimiteur.
Je crois qu'on peut utiliser à cette fin n'importe quel
caractère non significatif. Le seul impératif est de l'échapper
s'il est utilisé dans l'expression elle-même en le faisant
précéder d'un anti-slash. Ce qui donnerait, afin que votre
second exemple fonctionne :

"/<script[^>]*?>.*?</script>/si"

Avatar
CrazyCat
thierry wrote:
pourquoi la syntaxe suivante marche
$htmlPage = preg_replace("@<script[^>]*?>.*?</script>@si", '',
$htmlPage, -1);
alors que la syntaxe ci non:
$htmlPage = preg_replace("/<script[^>]*?>.*?</script>/si", '',
$htmlPage, -1);
donc la vraie question est quelle est la différence entre @ et /
dans la définition d'un masque pcre en PHP


Tu n'as pas l'impression qu'il y a un "/" dans ton masque? comment PHP
fait il la différence entre le délimiteur et l'élément du masque?
Tu aurais du faire:
"/<script[^>]*?>.*?</script>/si"
pour échapper le / interne.

--
Astuces informatiques: http://www.crazycat.info
Tchattez en liberté: http://www.crazy-irc.net

Avatar
Florian Sinatra
*thierry* @ 28/04/2006 14:55 :
la question qui me reste est
pourquoi la syntaxe suivante marche
$htmlPage = preg_replace("@<script[^>]*?>.*?</script>@si", '',
$htmlPage, -1);
alors que la syntaxe ci non:
$htmlPage = preg_replace("/<script[^>]*?>.*?</script>/si", '',
$htmlPage, -1);


Si tu ouvrais mieux tes mirettes, tu verrais que le délimiteur du second
se trouve dans la balise de fermeture du script.

donc la vraie question est quelle est la différence entre @ et /
dans la définition d'un masque pcre en PHP


Aucune, du moment que le délimiteur n'est pas présent dans le motif,
ainsi que d'autres subtilités expliquées ici :
http://expreg.com/expreg_article.php?art=apcre_delim (site de référence
pour les expressions rationelles).

Perso, j'utilise toujours l'accent grave (backquote) ` qui a très peu de
chances de se trouver dans le motif, n'est pas un métacaractère et rend
le motif très lisible.

Avatar
Thomas Harding
Le 28-04-2006, thierry a écrit :
la question qui me reste est
pourquoi la syntaxe suivante marche
$htmlPage = preg_replace("@<script[^>]*?>.*?</script>@si", '',
$htmlPage, -1);

alors que la syntaxe ci non:
$htmlPage = preg_replace("/<script[^>]*?>.*?</script>/si", '',
$htmlPage, -1);


Les deux caractères marquent les limites de l'expression régulière,
ce qui suit le second étant le modificateur.

la seconde _peut_ fonctionner à condition de mettre un certain nombre
d'antislashes (3 ou 4, je sais plus, c'est ardu, et ça dépend en plus
du fait que tu utilises des double- ou simple- quotes :) devant celui
de ta balise fermante (</script>).

Tu aurais mle même problème avec un @ à l'intérieur de ta RegExp, auquel
cas le mieux serait un autre délimiteur (n'importe-quoi de pas
alphanumérique).

--
Thomas Harding

Avatar
Olivier Miakinen

Perso, j'utilise toujours l'accent grave (backquote) ` qui a très peu de
chances de se trouver dans le motif, [...]


Ça arrive parfois, par exemple dans la liste des caractères autorisés
pour la partie gauche d'une adresse de courriel :
<http://faqfclphp.free.fr/#rub5.3>.

Sinon, à la liste des avantages que présente le « ` », j'ajoute que ce
caractère fait partie de us-ascii : l'avantage que cela représente,
c'est qu'il ne se transforme pas en série de plusieurs octets quand les
pages sont en UTF-8 ! Je le précise car il me semble me souvenir que
quelqu'un préconisait le caractère « ¦ », qui lui n'en fait pas partie.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
thierry
merci pour vos réponses

effectivement je devrais mieux ouvrir mes yeux

mais l'info selon la quelle on peut utiliser comme délimiteur n'importe
quel caractère ne se trouvant pas dans le motif est trés bonne à prendre.

encore merci

thierry
Avatar
Florian Sinatra
*Olivier Miakinen* @ 28/04/2006 20:00 :
Perso, j'utilise toujours l'accent grave (backquote) ` qui a très peu de
chances de se trouver dans le motif, [...]


Ça arrive parfois, par exemple dans la liste des caractères autorisés
pour la partie gauche d'une adresse de courriel :
<http://faqfclphp.free.fr/#rub5.3>.


Tu veux dire que tout ca
[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+
est autorisé ? M'en doutais pas.

Sinon, à la liste des avantages que présente le « ` », j'ajoute que ce
caractère fait partie de us-ascii : l'avantage que cela représente,
c'est qu'il ne se transforme pas en série de plusieurs octets quand les
pages sont en UTF-8 ! Je le précise car il me semble me souvenir que
quelqu'un préconisait le caractère « ¦ », qui lui n'en fait pas partie.


En effet, c'est non négligeable, mais je n'ai pas autant de
connaissances que toi en charsets, j'ai simplement suivi le conseil de
RegExp.com.