2011-10-20 6 views
0

Les expressions régulières ne sont pas un point fort. Je peux faire des choses simples, mais celui-ci vient d'avoir ma chèvre !! Donc, quelqu'un pourrait me donner un coup de main avec celui-ci.eregi_replace à preg_replace stuff de conversion

Voici le commentaire dans le code:

// Si le travail de détection UTF8 na pas avant, bande de ces personnages étranges pour un trait de soulignement, en dernier recours.

eregi_replace("[^a-z0-9 \-\.\(\)\/\\]","_",$str); 

à (voici ce que j'ai essayé)

preg_replace("{[^a-z0-9 \-\.\(\)\/\\]}i","_",$str); 

Tous les pros regex là-bas qui me donnent un coup de main?

+0

Peu importe, je l'ai. il devient preg_replace ("{[^ a-z0-9] \ - \. \ (\) \/\\ /} i", "_", $ str) – Alex7011

+0

Je serais prudent, cependant - je ne sais pas Je pense que les expressions 'eregi_replace' et les expressions' preg_replace' proposées sont presque équivalentes. Je recommande de le tester à fond, puis si vous pensez toujours que c'est la réponse, postez-le comme une réponse et acceptez-le –

Répondre

1

Vous devez spécifier l'identificateur de regexp tels que # ou /

preg_replace("#[^a-z0-9 \-\.\(\)\/\\]#i","_",$str); 

Vous devez placer votre expression régulière dans les caractères d'identification.

+0

PHP a supporté les deux types de délimitation pendant un moment, donc ce n'est pas un/le problème avec l'expression, ce n'est probablement pas une mauvaise idée de les changer de toute façon! –

1

D'abord, je crois que le { et } sont très bien comme délimiteurs pour l'expression des drapeaux, mais je sais qu'il ya des saveurs regex qui ne supportent pas, il pourrait être une bonne idée d'utiliser quelque chose comme Deuxièmement, je ne sais pas exactement comment l'expression a fonctionné, car AFAIK s'échappant avec un caractère \ ne fonctionne pas avec les expressions ERE. Par leur position dans la classe (^ ne peut pas être le premier caractère, ] doit être le premier caractère, et - doit être le premier ou le dernier caractère). Le caractère - dans la première expression serait interprété comme un spécificateur de plage (dans ce cas, un caractère compris entre \ et \). De plus, les caractères \ sont traités littéralement, de sorte que vous avez une regex confuse et largement redondante.

L'expression de remplacement, cependant, doit être en notation/saveur preg, donc il y a des changements de règles:

  • Très peu de choses besoin être échappé dans une classe de personnage, même avec les nouvelles règles
  • le caractère \ doit être échappé deux fois - une fois pour la chaîne, puis une fois de plus pour la regex - sinon, il échappera au support de fermeture ]
  • en supposant que vous voulez correspondre à un tableau de bord (ou plutôt correspondre à quelque chose AUTRE un un tiret, il doit être déplacé à la fin de la classe

Alors, voici quelques code (link) que je crois fait ce que vous avez besoin de le faire:

$source = 'hello! @#$%^&* wazzup-dawg?.()/\\[]{}<>:"'; 
$blah = preg_replace('![^a-z0-9 .()/\\\\-]!i','_',$source); 

print($blah); 
0

preg_replace ("{[^a-z0-9] -.()/\ /} i "," _ ", $ str)

fonctionne très bien.

Je l'ai essayé avec tous # et/et {et ils ont tous travaillé.

Questions connexes