Mi cadena de texto es el siguiente:El uso de expresiones regulares para extraer nombre de usuario de la dirección de correo electrónico
[email protected] (John Doe)
que necesito para obtener sólo la parte antes de la @ y nada más. El texto proviene de un objeto XML simple, si eso es importante.
El código que tengo se parece a esto:
$authorpre = $key->{"author"};
$re1 = '((?:[a-z][a-z]+))';
if ($c = preg_match_all ("/".$re1."/is", $authorpre, $matches))
{
$author = $matches[1][0];
}
A veces el nombre de usuario puede tener un número o un carácter de subrayado antes del símbolo @, que es donde se detiene la expresión regular que parece.
Su expresión regular tiene un grupo de captura externa '()' y un grupo de no capturar interior '(' :). El grupo interno que no captura puede ser innecesario dado que desea capturar lo que está adentro. El '[a-z]' significa capturar una letra minúscula. El '[a-z] +' significa capturar 1 o más letras minúsculas. De modo que su expresión significa capturar todo lo que sea 2 o más letras minúsculas de largo. Si pusiera un '^' al principio de su expresión, se aseguraría de que la coincidencia solo tenga lugar desde el _beginning_ del texto. –
No será muy divertido, me temo. Algunos ejemplos de cadenas es posible que desee probar: '" John Doe "@ example.com (John Doe)', '"(>'.')>"@example.com (John Doe)', 'foo @ [192.168. 2.1] (John Doe) ', '^.^@example.com (John Doe)', '" [email protected]@c"@example.com (John Doe) "' Sí, todos son válidos por correo electrónico direcciones :-) – Joey
@Johannes: '" [email protected]@c"@example.com (John Doe) '¿realmente está permitido? Eso realmente complica las cosas ... – Welbog