Padrão PHP preg_replace (), sanitização de cordas

Eu tenho um padrão de e-mail regex e gostaria de tirar todos os caracteres, mas padrão, da string, em um curto, eu quero sanizar a string …

Eu não sou um guru regex, então o que estou perdendo na regex?

<?php $pattern = "/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[az])\.)+[az]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i"; $email = 'contact@domain.com'; // wrong email $sanitized_email = preg_replace($pattern, NULL, $email); echo $sanitized_email; // Should be contact@domain.com ?> 

Padrão tirado de: http://fightingforalostcause.net/misc/2006/compare-email-regex.php (o primeiro …)

Você não pode filtrar e combinar ao mesmo tempo. Você precisará dividi-lo em uma class de personagem para remover caracteres inválidos e uma expressão regular correspondente que verifica um endereço válido.

 $email = preg_replace($filter, "", $email); if (preg_match($verify, $email)) { // ok, sanitized return $email; } 

Para o primeiro caso, você deseja usar uma class de caractere negada /[^allowedchars]/ .
Para a segunda parte você usa a estrutura /^...@...$/ .

Dê uma olhada na extensão do filtro PHP. Ele usa const unsigned char allowed_list[] = LOWALPHA HIALPHA DIGIT "!#$%&'*+-=?^_\ {|} ~ @. []”; `Para limpeza.

E há o monstro para validação: linha 525 em http://gcov.php.net/PHP_5_3/lcov_html/filter/logical_filters.c.gcov.php – mas confira http://www.regular-expressions.info/ email.html para uma variante mais comum e mais curta.

Eu acho que a function filter_var php também pode fazer essa funcionalidade e de maneira mais limpa. Dê uma olhada em: http://www.php.net/manual/en/function.filter-var.php

exemplo:

  $email = "chris@exam\\ple.com"; $cleanEmail = filter_var($email, FILTER_SANITIZE_EMAIL); // chris@example.com