PHP:preg_match for";一些多字字符串“+;一些。email@address>;";]
需要解析以以下可能形式出现的字符串:PHP:preg_match for";一些多字字符串“+;一些。email@address>;";],php,regex,parsing,Php,Regex,Parsing,需要解析以以下可能形式出现的字符串: Some User Name Some User Name <user.mail@address> 某个用户名 某个用户名 所以用户名(多个单词)始终存在,但电子邮件是可选的,并包含在尖括号中 我需要从中了解: 用户名,一个字符串,包含由\s或\h分隔的多个单词 下一个电子邮件地址(如果存在)不带尖括号。如果未指定电子邮件地址,则生成的子掩码数组应为空(但始终存在于结果中) 我尝试了一些不同的方法 preg\u匹配('/^(.*?)\s*(
Some User Name
Some User Name <user.mail@address>
某个用户名
某个用户名
所以用户名(多个单词)始终存在,但电子邮件是可选的,并包含在尖括号中
我需要从中了解:
preg\u匹配('/^(.*?)\s*(?:\)?$/s',$in,$out)
但这不起作用
感谢任何人帮助我。要获得由
\h
和可选电子邮件地址分隔的所有单独单词,您可以使用\G
锚获得迭代匹配,在上一次匹配结束时声明位置
(?|^(\w+)|\G(?!^)\h+(\w+))(?:\h+<([^<>\r\n]+)>$)?
输出
非常感谢。好像这就是我要找的。我忘记了一个细节。用户名(如果可能的话)作为单个字符串(包含多个单词)更好。我修正了上面的问题。@CodeSmith你想把
一些
和用户名
作为单独的单词吗?获取用户名的逻辑是什么?它总是第二个和第三个词吗?总是两个字吗?如果它是某个测试用户名
或者只是用户名
或者某个测试用户名
,那么该怎么办?对不起,我不太清楚。用户名是指整个字符串(“某些用户名”
或“此处的某些测试用户名”
)在
(如果存在)之前或字符串结尾(如果未指定电子邮件地址)之前。我只是想强调一下,它可能包含多个空格分隔的单词,所以它不是单个单词的用户名。但无论如何,我已经通过join(“”,$matches[1])
使用您的解决方案来连接用户名词。再次非常感谢你。
Example code
$pattern = "~(?|^(\w+)|\G(?!^)\h+(\w+))(?:\h+<([^<>\r\n]+)>$)?~";
$strings = [
"Some User Name ",
"Some User Name <user.mail@address>"
];
foreach ($strings as $str) {
preg_match_all($pattern, $str, $matches);
print_r($matches[1]);
print_r(array_filter($matches[2]));
}
Array
(
[0] => Some
[1] => User
[2] => Name
)
Array
(
)
Array
(
[0] => Some
[1] => User
[2] => Name
)
Array
(
[2] => user.mail@address
)