2012-03-12 3 views
2

je besoin d'un simple regex qui fonctionnera en preg_replace qui convertira toute entrée donnée aux règles suivantes:simple regex preg_replace que je ne peux pas comprendre

1) Le premier caractère doit être AZ ou az

2) S'il y a plus d'un caractère, les caractères suivants doivent être AZ, az, 0-9 ou un espace

J'ai besoin que tous les caractères non conformes soient supprimés et la chaîne résultante être retourné.

je cela comme la chaîne regex:

/^[a-zA-Z][a-zA-Z0-9 ]*$/ 

J'ai un peu d'expérience de regex, donc je suppose que cela devrait fonctionner, mais lorsque je tente une chaîne comme:

1Athsj294-djs 

ici: http://www.functions-online.com/preg_replace.html

Cela ne fonctionne pas, s'il vous plaît, aidez. Merci!

+0

Veuillez clarifier vos exigences. Voulez-vous extraire une sous-chaîne contiguë de l'entrée ou une sous-chaîne non contiguë? Quelle est la sortie correcte pour votre exemple d'entrée, '1Athsj294-djs'? Est-ce 'Athsj294' ou' Athsj294djs', ou autre chose? –

+0

Je préférerais Athsj294djs, mais il semble que ce n'est pas une option ?, donc Athsj294 fonctionnera –

+0

J'ai fini par enchaîner ma réponse acceptée avec un premier 'preg_replace' avec ce modèle:'/[^ A-Za-z0-9 ]/'et cela m'a donné mon résultat désiré de' Athsj294djs' –

Répondre

2
$result = preg_replace('/^[^a-z]*([a-z][a-z0-9 ]*).*$/si', '\1', $subject); 

change

1Athsj294-djs 

dans

Athsj294 

Explication:

^   # Start of string 
[^a-z]*  # Match (optionally) any characters except ASCII letters 
(   # Match and capture... 
[a-z]  # one ASCII letter 
[a-z0-9 ]* # zero or more ASCII letters/digits or spaces 
)   # End of capturing group 
.*   # Match the rest of the string 
$   # Match the end of the string 

Les modificateurs /si font la Rege x insensible à la casse et permet au point de correspondre aux nouvelles lignes.

+0

Très gentil! Merci! –

+1

Vous pouvez capturer les "djs" comme OP clarifie maintenant ce qu'ils veulent, en capturant '(. *)' Comme une deuxième chaîne de correspondance, en le mettant dans le résultat avec '\ 1 \ 2', puis en ayant une seconde passe qui se débarrasse des caractères non conformes après le caractère conforme initial: '$ resultat = preg_replace ('/ [^ a-z0-9] /', '', $ result);' –

0

Je pense que votre regex semble bien, sauf que vous devez supprimer ^ et $

Il doit donc être

preg_match('/[a-zA-Z][a-zA-Z0-9 ]*/', $subject)   // this is for preg_match though 
preg_replace('/[^a-zA-Z]*([a-zA-Z][a-zA-Z0-9]*)[^a-zA-Z0-9]*/', '$1', '1Athsj294-djs') // for preg_replace 
0

Eh bien, vous pouvez capturer preg_match('/^[a-zA-Z][a-zA-Z0-9 ]*/', $string, $matches) par exemple et $ matches [0] contiendra votre rencontre. Si vous voulez réellement preg_replace qui nécessite lookahead.

Questions connexes