我有这种格式的电子邮件地址:
Jane Doe <jane.doe@example.com>
我想将Jane Doe
设置为一个变量,将jane.doe@example.com
设置为另一个变量。
这是一个正则表达式的情况,还是有更优雅的方式?
我能得到的最接近的是表达式/\<(.*?)\>
,它返回<jane.doe@example.com>
(带尖括号)。
答案 0 :(得分:1)
您可以使用您的模式(或一点修改版本)来preg_split
字符串,并获得一个包含2个值的数组:
$s = 'Jane Doe <jane.doe@example.com>';
$res = preg_split('/\s*<([^>]*)>/', $s, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
print_r($res); // => Array ( [0] => Jane Doe [1] => jane.doe@example.com )
请参阅PHP demo
\s*<([^>]*)>
模式找到0+空格(\s*
)后跟<
,然后将除>
以外的任何0 +字符捕获到第1组({{1}然后匹配[^>]*
。 >
标志使PREG_SPLIT_DELIM_CAPTURE
保持结果数组中的子匹配(组1值)。 preg_split
标志将丢弃可能在开头或结尾出现的任何空项。 PREG_SPLIT_NO_EMPTY
限制参数将返回所有拆分块(无限制)。
还有一个匹配的解决方案,我建议使用命名的捕获组:
-1
模式详情
$s = 'Jane Doe <jane.doe@example.com>';
if(preg_match('/^(?<name>.*\S)\s*<(?<email>.*)>$/', $s, $m)) {
echo $m["name"] . "\n";
echo $m["email"];
}
- 字符串开头^
- Group&#34; name&#34 ;:任意0个字符,直到最后一个非空白字符后跟... (?<name>.*\S)
- 0+空白字符\s*
- <
字符<
- 小组&#34;电子邮件&#34;:任意0+字符,尽可能多的(?<email>.*)
- >$
位于字符串的末尾。答案 1 :(得分:0)
使用preg_split
和list
函数:
$input = 'Jane Doe <jane.doe@example.com>';
list($name, $email) = preg_split('/\s(?=<)/', $input);
$email = trim($email, '<>');
var_dump($name, $email);
输出:
string(8) "Jane Doe"
string(20) "jane.doe@example.com"
答案 2 :(得分:0)
使用捕获组,您可以匹配以下正则表达式。
正则表达式: ([^<]*)<([^>]*)>
说明:
([^<]*)
将捕获第一组中的名称。
([^>]*)
将捕获第二组中的电子邮件ID。
<强> Regex101 Demo 强>
Php代码:
<?php
$line = "Jane Doe <jane.doe@example.com>";
if (preg_match("/([^<]*)<([^>]*)>/", $line, $match)) :
$name=$match[1];
$email=$match[2];
print "Name: ". $match[1];
print "\nEmail Id: ". $match[2];
endif;
?>
<强>输出强>
姓名:Jane Doe
电子邮件ID:jane.doe@example.com
<强> Ideone Demo 强>