正则表达式匹配全名与逗号或空格

时间:2017-05-04 18:26:35

标签: php regex commonmark

我正在使用CommonMark,我创建了一个'@mention'解析器,当找到@mention时会返回一个链接。但是,我正在调整它以链接全名而不是用户名。这是我现在拥有的:

$cursor->match('/^\w+,(.*)\s/');

然而,这似乎错误地捕获了名称,并链接了另一个名称的开头(见下文):

enter image description here

有没有人有任何想法我可以更改以匹配用逗号和/或空格分隔的整个名称?我写的正则表达式很糟糕。

提前感谢您的帮助!

修改

以下是应该匹配的内容:

(名称最少只能为2个字,最多3个字)

  • 鲍曼,史蒂夫
  • Steve Bauman
  • Doe,Mary Sue
  • Mary Sue Doe

带逗号的姓氏为一个单词。

不应该匹配的内容:

  • 史蒂夫
  • 鲍曼
  • 玛丽
  • Doe的

正则表达式需要匹配整个名称,而不是单个名称。

这是match方法背后的CommonMark代码:

if (!preg_match($regex, $subject, $matches, PREG_OFFSET_CAPTURE)) {
    return;
}

结果是:

if (!preg_match('/^\w+,(.*)\s/', "Bauman, Steve", $matches, PREG_OFFSET_CAPTURE)) {
    return;
}

2 个答案:

答案 0 :(得分:3)

根据您的新规则,匹配一个包含2或3个字的名称,并且应以空格()或逗号(,)分隔

/\w+([, ]+\w+){1,2}/

Regex 101

答案 1 :(得分:0)

你去吧

<?php
$string = <<<EOS
something @name, bla bla bla @name.surname something else
Lorem ipsum @o'brien 
EOS;

$matches = [];
preg_match_all('/@[^\s,]+/', $string, $matches);
var_dump($matches);

并且正在工作demo