Using regex to extract username from email address


My string of text looks like this: (John Doe)

I need to get just the part before the @ and nothing else. The text is coming from a simple XML object if that matters any.

The code I have looks like this:

$authorpre = $key->{"author"};
$re1 = '((?:[a-z][a-z]+))';

if ($c = preg_match_all ("/".$re1."/is", $authorpre, $matches))
    $author = $matches[1][0];

Sometimes the username might have numbers or an underscore before the @ symbol, which is where the regex stops it seems.

8/6/2017 12:05:13 PM

Accepted Answer

The regular expression that will match and capture any character until it reaches the @ character:


That seems like what you need. It'll handle all kinds of freaky variations on e-mail addresses.

I'm not sure why Ben James deleted his answer, since I feel it's better than mine. I'm going to post it here (unless he undeletes his answer):

Why use regex instead of string functions?

$parts = explode("@", "");
$username = $parts[0];

You don't need regular expressions in this situation at all. I think using explode is a much better option, personally.

As Johannes Rössel points out in the comments, e-mail address parsing is rather complicated. If you want to be 100% sure that you will be able to handle any technically-valid e-mail address, you're going to have to write a routine that will handle quoting properly, because both solutions listed in my answer will choke on addresses like "a@b" There may be a library that handles this kind of parsing for you, but I am unaware of it.

5/23/2017 10:30:30 AM

@OP, if you only want to get everything before @, just use string/array methods. No need complicated regex. Explode on "@", then remove the last element which is the domain part

$str = '"peter@john@doe" (John Doe)';
$s = explode("@",$str);
array_pop($s); #remove last element.
$s = implode("@",$s);
print $s;


$ php test.php

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow