2017-05-04 244 views
0

我正在使用CommonMark,并且我创建了一个'@mention'解析器,它将在找到@mention时返回链接。但是,我正在调整它来链接全名而不是用户名。这是我目前有:正则表达式匹配全名和逗号或空格

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

然而,这似乎是不正确的捕捉名称和链接的其他名字的开始(见下图):

enter image description here

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

感谢您提前提供任何帮助!

编辑:

这里的应该配什么:

(A名称只能是2个字的最小和3个字以内)

  • 鲍曼,史蒂夫
  • 史蒂夫·鲍曼
  • Doe,Mary Sue
  • Mary苏母鹿

用逗号姓氏将是一个单词。

什么应该不匹配:

  • 史蒂夫
  • 鲍曼
  • 玛丽
  • 李四

正则表达式必须匹配整个名称,而不是一个名称。

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

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

这导致到:

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

什么是正则表达式的具体规则?如果你添加了一个样本输入和一组应该匹配并且不应该匹配的结果,那将会更加简单。 – degant

+0

你可以试试一次:^ \ w + |,| \ s | \ w – Jeet

+0

嗨@degant,对不起,我正在编辑这个问题。 –

回答

3

根据你的新规则,匹配有2名或3个字,应该用空格()或逗号分隔的名称(,)

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

Regex 101

+0

这个作品非常完美!非常感谢! –

+0

没问题。很高兴我能帮上忙! – degant

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

+0

Unforuntately这不起作用,例如将'@Bauman,Steve'结果插入到包含“@Bauman”而不是“@Bauman,Steve”的数组中 –