2010-09-22 5 views
2

J'ai converti quelques eregs à preg_matches en remplaçant la ^ et dernière initiale $ avec / s (je l'espère cela suffit), mais j'ai une ereg_replace dans la même fonction que je suis pas sûr de.ereg_replace à preg_replace pour un regex particulier

C'est à partir d'une fonction checkPostcode à trouver here.

// Take account of the special BFPO c/o format 
$postcode = ereg_replace ('C\/O', 'c/o ', $postcode); 

Si je change à preg_replace sans altérer l'expression rationnelle lui donne cette erreur: Delimiter must not be alphanumeric or backslash

Pas vraiment avoir une solide compréhension de regex Je ne sais pas ce que je dois changer tout en assurant le modèle fait toujours son travail.

Répondre

3

Tout d'abord, comme mentionné ailleurs, vous devriez probablement utiliser str_replace() plutôt que regex pour les cas simples comme celui dans votre exemple.

Maintenant, une explication rapide sur les regex en PHP:

Comme vous le savez déjà clairement, le ereg_ * fonctions sont maintenant dépréciée en PHP, et vous devez utiliser le preg_ * fonctions à la place.

La principale différence entre les deux ensembles de fonctions est le type d'expression régulière qu'ils utilisent. Les fonctions ereg utilisent une regex de type POSIX, tandis que les fonctions preg utilisent une regex de style PERL. Les développeurs PHP ont décidé de standardiser sur regex style PERL, d'où la raison pour laquelle les fonctions ereg sont dépréciées. Je mentionne tout cela parce qu'il est utile de comprendre les différences entre les deux types de regex lors de la conversion de l'un à l'autre. Pour la plupart, ils sont très similaires - la plupart des codes regex communs fonctionnent de la même manière entre eux. Par exemple, les ^ et $ sont les mêmes dans les deux, indiquant des ancres au début et à la fin de la chaîne. Là où ils diffèrent énormément, c'est que les fonctions preg ne supportent pas les classes de caractères verbales que supporte ereg.Donc, si vous avez des eregs qui incluent des codes comme [:digit:] ou [:alpha:] alors vous aurez plus de travail pour les convertir. Ils peuvent encore être convertis, cependant.

Il y a quelques autres différences entre les deux, mais à moins que vous ne fassiez des expressions complexes (et ça ne sonne pas comme ça), il est peu probable que vous rencontriez d'autres problèmes de conversion entre les deux styles.

A part ça, la grande différence est que preg requiert un caractère délimiteur à chaque extrémité de la chaîne regex pour indiquer qu'il s'agit d'une regex. (Ceci est généralement une barre oblique, mais peut être presque n'importe quel symbole tant que c'est la même chose aux deux extrémités). Ce n'est pas la même chose que les^et $, donc, votre remarque sur leur remplacement est incorrecte; vous avez toujours besoin du^et $ ainsi que des barres obliques.

Par conséquent: pour convertir le code ereg comme ceci: '^xyz$', vous serait tout simplement ajouter des barres obliques, comme ceci: '/^xyz$/'

espoir qui aide.

[modifier]

Juste un montage rapide pour vous donner quelques documents de référence supplémentaires:

Les deux sont dans mes favoris permanents.

+0

Merci pour la réponse en profondeur! Il y a quelques utilisations de '[: space:]' dans les regexes dans la fonction de code postal, qu'il semblerait que je devrais convertir en '\ s'? – bcmcfc

+0

[: space:] peut être converti en ... euh ... un caractère espace. hehe. Facile, hein? Voir aussi les liens de référence que j'ai ajoutés à ma réponse principale. – Spudley

+0

D'oh! J'ai en fait une impression (tachée de café) de cette feuille de triche à côté de moi, mais sans une bonne compréhension ... c'est juste de la tricherie! ;-) – bcmcfc

4

I've converted some eregs to preg_matches by replacing the initial^and final $ with /s

Vous ne devriez pas les avoir remplacés. Vous avez probablement besoin à la fois:

'/^.....$/' 

Not really having a solid grasp of regex I'm not sure what I need to change C\/O whilst ensuring the pattern still does its job.

Normalement, vous utilisez / pour délimiter l'expression régulière, mais dans ce cas ce serait une bonne idée de choisir un autre caractère non alphanumérique de sorte que vous ne pas besoin d'échapper à la barre oblique.

'#C/O#' 
0
<? 
$postcode = "test C/O"; 
echo ereg_replace ('C\/O', 'c/o ', $postcode); 
//test c/o 
echo preg_replace ('/c\/o/i', 'c/o ', $postcode); 
//test c/o 
?> 

si quelqu'un pourrait ajouter pourquoi, quelqu'un vote vers le bas, donc je peux apprendre sur elle?

+0

Si quelqu'un pouvait ajouter pourquoi, quelqu'un voterait pour que je puisse en tirer des leçons? –

+0

Je ne suis pas le downvoter, votre solution fonctionnerait (bien que str_replace soit probablement plus efficace). Cependant, je ne publierais jamais quelque chose avec 'short_open_tags', peut-être que c'était ça. – Wrikken

+0

Deux raisons: 1. votre alternative proposée ne se comporte pas de la même manière que l'original, 2. aucune indication d'une «meilleure» solution ou d'une aide réelle du tout avec le problème du PO. – salathe

3

Si vous avez juste une chaîne fixe qui doit être remplacée, pourquoi n'utilisez-vous pas str_replace?

$postcode = str_replace('C/O', 'c/o ', $postcode); 
+0

+1 D'accord. Dans cet exemple particulier, str_replace() est la fonction à utiliser; il n'y a pas besoin d'une regex du tout. Cela dit, nous avons encore besoin de résoudre la question pour l'autre ereg à la conversion preg il a déclaré qu'il fait, si str_replace() est vraiment qu'une solution partielle. – Spudley

+0

Je n'étais pas vraiment sûr de ce qu'il faisait au début - je n'y ai pas vraiment réfléchi et j'ai juste supposé que c'était une sorte de modèle mais ce n'est pas le cas. C'est juste la conversion 'C/O' en' c/o', alors oui on dirait que je vais le remplacer par 'str_replace'. – bcmcfc

Questions connexes