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>
某个用户名
某个用户名
所以用户名(多个单词)始终存在,但电子邮件是可选的,并包含在尖括号中

我需要从中了解:

  • 用户名,一个字符串,包含由\s或\h分隔的多个单词
  • 下一个电子邮件地址(如果存在)不带尖括号。如果未指定电子邮件地址,则生成的子掩码数组应为空(但始终存在于结果中)
  • 我尝试了一些不同的方法

    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
    )