The regexp below thinks that the e-mail address:
'me@de.com' is invalid, which it is not.
'/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@
([a-z0-9])([-a-z0-9_])+([a-z0-9])*
(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*$/i'
I modified it and it seems to work for me in my limited tests of it.
YMMV.
preg_match
(PHP 4, PHP 5)
preg_match — Realizar una comparación de expresión regular
Descripción
Busca en asunto por una coincidencia con la expresión regular dada en patron .
Lista de parámetros
- patron
-
El patrón a buscar, como una cadena.
- asunto
-
La cadena de entrada.
- coincidencias
-
Si se entrega el parámetro coincidencias , entonces éste es llenado con los resultados de la búsqueda. $coincidencias[0] contendrá el texto que coincidió con el patrón completo, $coincidencias[1] tendrá el texto que coincidió con el primer sub-patrón en paréntesis capturado, y así sucesivamente.
- banderas
-
banderas puede ser la siguiente bandera:
- PREG_OFFSET_CAPTURE
- Si es pasada esta bandera, entonces para cada coincidencia encontrada también será devuelto el desplazamiento de la cadena anexa. Note que esto modifica el valor de retorno a una matriz en donde cada elemento es una matriz que consiste de la cadena coincidente en el índice 0 y su desplazamiento de cadena al interior de asunto en el índice 1.
- desplazamiento
-
Normalmente, la búsqueda comienza desde el principio de la cadena de asunto. El parámetro opcional desplazamiento puede ser usado para especificar el lugar alterno desde donde empezar la búsqueda (en bytes).
Note: El uso de desplazamiento no es equivalente a pasar substr($asunto, $desplazamiento) a preg_match() en lugar de la cadena de asunto, ya que patron puede contener aserciones tales como ^, $ o (?<=x). Compare:
<?php
$asunto = "abcdef";
$patron = '/^def/';
preg_match($patron, $asunto, $coincidencias, PREG_OFFSET_CAPTURE, 3);
print_r($coincidencias);
?>El resultado del ejemplo seria:
Array ( )
mientras que el siguiente ejemplo
<?php
$asunto = "abcdef";
$patron = '/^def/';
preg_match($patron, substr($asunto,3), $coincidencias, PREG_OFFSET_CAPTURE);
print_r($coincidencias);
?>producirá
Array ( [0] => Array ( [0] => def [1] => 0 ) )
Valores retornados
preg_match() devuelve el número de veces que patron coincide. Este número será 0 (no existe coincidencia) o 1, ya que preg_match() detendrá la búsqueda después de la primera coincidencia. Por el contrario, preg_match_all() continuará hasta llegar al final de asunto . preg_match() devuelve FALSE si ocurre un error.
Registro de cambios
| Versión | Descripción |
|---|---|
| 4.3.3 | El parámetro desplazamiento fue agregado |
| 4.3.0 | Se agregó la bandera PREG_OFFSET_CAPTURE |
| 4.3.0 | El parámetro banderas fue agregado |
Ejemplos
Example #1 Buscar la cadena de texto "php"
<?php
// El caracter "i" después del delimitador del patrón indica una
// busqueda insensible a mayúsculas/minúsculas
if (preg_match("/php/i", "PHP es el lenguaje de scripting web de moda.")) {
echo "Se ha encontrado una coincidencia.";
} else {
echo "No se ha encontrado una coincidencia.";
}
?>
Example #2 Buscar la palabra "web"
<?php
/* La secuencia \b en el patrón indica un límite de palabra, así que solo la
* palabra única "web" coincide, y no una palabra parcial como "webbing" o
* "cobweb" */
if (preg_match("/\bweb\b/i", "PHP es el lenguaje de scripting web de moda.")) {
echo "Se ha encontrado una coincidencia.";
} else {
echo "No se ha encontrado una coincidencia.";
}
if (preg_match("/\bweb\b/i", "PHP es el website del lenguaje de scripting de moda.")) {
echo "Se ha encontrado una coincidencia.";
} else {
echo "No se ha encontrado una coincidencia.";
}
?>
Example #3 Obtener el nombre de dominio de una URL
<?php
// obtener el nombre de host de una URL
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $coincidencias);
$host = $coincidencias[1];
// obtener los últimos dos segmentos del nombre de host
preg_match('/[^.]+\.[^.]+$/', $host, $coincidencias);
echo "el nombre de dominio es: {$coincidencias[0]}\n";
?>
El resultado del ejemplo seria:
el nombre de dominio es: php.net
Notes
preg_match
03-Jul-2008 11:30
26-Jun-2008 04:48
Paperweight, this pattern worked fine for me (even for intranet adresses, like "john@localhost"; and also for subdomain emails, like "john@foo.bar.com"):
'/([a-z0-9])([-a-z0-9._])+([a-z0-9])\@
([a-z0-9])([-a-z0-9_])+([a-z0-9])
(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*/i'
but, still, this won't replace the "activation link", that is the better way to check if an e-mail is valid or not.
26-May-2008 09:50
Because making a truly correct email validation function is harder than one may think, consider using this one which comes with PHP through the filter_var function (http://www.php.net/manual/en/function.filter-var.php):
<?php
$email = "someone@domain .local";
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "E-mail is not valid";
} else {
echo "E-mail is valid";
}
?>
04-Apr-2008 11:36
In addition to reiner-keller's comment about Umlaute using setlocale (LC_ALL, 'de_DE');
To enable 'de_DE' on my Debian 4 machine I first had to:
- uncomment 'de_DE' in file /etc/locale.gen and afterwards
- run locale-gen from the shell
