2010-07-21 4 views
1

J'ai écrit l'expression régulière suivante /^[A-Za-z0-9-_\s]*$/ en PHP qui permet les nombres, les lettres, les espaces, les tirets et les traits de soulignement. Je veux afficher ces correspondances qui ne sont pas valables contre la regex i.e "Mon nom est Blahblah !!!" devrait me donner "!!!" sortie.PHP trouver des mots qui ne sont pas en regex

+0

@ jason4: avez-vous besoin d'aide supplémentaire à cette question? :-) –

+1

Merci Andy E, carotte travaille toujours pour moi :) – Maximus

Répondre

10

Utilisez le symbole caret dans la classe de caractères pour inverser le match et enlever le début (^) et à la fin ($) caractères:

/[^A-Za-z0-9-_\s]+/ 

http://php-regex.blogspot.com/2008/01/how-to-negate-character-class.html

+0

Vous voulez vous débarrasser de ces ancres, et changer le '*' en '+'. L'OP essaye d'arracher des allumettes hors de la corde, ne correspond pas à l'ensemble. –

+0

@Alan: oui, les ancres de début et de fin ont disparu. Merci pour le conseil sur le '+', édité. –

2

Si vous remplacez tous les matchs avec les Chaîne vide puis vous obtiendrez les pièces non correspondantes de retour:

preg_replace('/[A-Za-z0-9-_\s]+/', '', $string) 

Cela fonctionnera pour toute regex arbitraire, mais pour votre regex spécifique, la solution d'Andy est plus simple.

Notez que j'ai supprimé les ancres ^ et $ pour rendre ce travail.

+1

Vous devriez changer le '*' en '+'. Sinon, vous allez perdre beaucoup de temps à ne rien remplacer par rien. ;) –

0

preg_replace("/^[A-Za-z0-9-_\s]*$/","","My Name is Blahblah!!!") // Output: "!!!"

Ou, si vous voulez que tous les groupes d'entre eux

preg_split("/^[A-Za-z0-9-_\s]*$/","","My Name is Blahblah!!!")

0

Vous devez mettre le hiphen - au début ou à la fin de la classe de caractères ou y échapper, de sorte que votre regex serait:

/[^-A-Za-z0-9_\s]+/ 

ou

/[^A-Za-z0-9_\s-]+/ 

ou

/[^A-Za-z0-9\-_\s]+/ 
Questions connexes