【发布时间】:2010-12-20 09:08:05
【问题描述】:
我的文本字符串如下所示:
johndoe@domain.com (John Doe)
我只需要得到@之前的部分,没有别的。如果重要的话,文本来自一个简单的 XML 对象。
我的代码如下所示:
$authorpre = $key->{"author"};
$re1 = '((?:[a-z][a-z]+))';
if ($c = preg_match_all ("/".$re1."/is", $authorpre, $matches))
{
$author = $matches[1][0];
}
有时用户名可能在 @ 符号前有数字或下划线,这似乎是正则表达式停止的地方。
【问题讨论】:
-
您的正则表达式有一个外部捕获组
()和一个内部非捕获组(?:)。考虑到您想要捕获内部的内容,内部非捕获组可能是不必要的。[a-z]表示捕获小写字母。[a-z]+表示捕获 1 个或多个小写字母。因此,您的表达式有效地意味着捕获任何长度为 2 个或更多小写字母的内容。如果您将^放在表达式的最前面,它将确保匹配只发生在文本的 开头 处。 -
恐怕不会很有趣。您可能想要测试的一些示例字符串:
"John Doe"@example.com (John Doe)、"(>'.')>"@example.com (John Doe)、foo@[192.168.2.1] (John Doe)、^.^@example.com (John Doe)、"a@b@c"@example.com (John Doe)"。是的,这些都是有效的电子邮件地址 :-) -
@Johannes:
"a@b@c"@example.com (John Doe)真的允许吗?这确实使事情变得复杂...... -
Welbog: en.wikipedia.org/wiki/E-mail_address ... 你可以引用本地部分,否则不允许使用字符。
标签: php regex preg-match