0

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

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

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

在此处输入图像描述

有谁知道我可以更改什么以匹配用逗号和/或空格分隔的整个名称?我不擅长写正则表达式。

提前感谢您的帮助!

编辑:

以下是应该匹配的内容:

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

  • 鲍曼,史蒂夫
  • 史蒂夫鲍曼
  • 母鹿,玛丽苏
  • 玛丽苏杜

带逗号的姓氏只能是一个单词。

什么不应该匹配:

  • 史蒂夫
  • 鲍曼
  • 玛丽
  • 能源部

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

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

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

这导致:

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

2 回答 2

4

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

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

正则表达式 101

于 2017-05-04T19:26:10.663 回答
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);

和工作演示

于 2017-05-04T18:35:42.923 回答