在字符串中检测@ mentions的问题

时间:2014-04-24 11:53:45

标签: php regex

我有以下代码:

$string = "Manual balls knit cardigan @120rb

ORDER
BB 28AFF6A6 atau 25AE5DB3 
Phone 081298249949 atau 081310570229 
Line indy2212 atau indy2281 
FORMAT
Nama 
Alamat 
Telp 
Kode barang";

        if (preg_match('/(?<= )@([^@ ]+)/', $string, $matches)) {
            var_dump(count($matches));
            var_dump('first ' . $matches[0]);
            var_dump('second ' . $matches[1]);
        }

然而,这导致$matches返回计数数组2.使用以下字符串:

2
@120rb ORDER BB
120rb ORDER BB

我的问题是为什么?为什么它与字符串匹配两次?我的正则表达式有什么问题

1 个答案:

答案 0 :(得分:3)

preg_match()将匹配项存储到您作为第三个参数提供的数组中。在这种情况下,您的preg_match()语句如下所示:

preg_match('/(?<= )@([^@ ]+)/', $string, $matches);

所以$matches包含所有匹配项,其中:

  • $matches[0]将包含与完整模式匹配的文字
  • $matches[1]将使第一个捕获组匹配文本
  • $matches[2]将使第二个捕获组匹配文本
  • 等......

此处的正则表达式为(?<= )@([^@ ]+)。它完全匹配@120rb ORDER BB,因此它将存储在$matches[0]中,而捕获组([^@ ]+)只会捕获@120rb ORDER BB)之后的部分,它将存储在$matches[1]

目前,正则表达式不会检测提及是否在字符串的开头。此外,它会错误地匹配下一行的空白,因为[^@]将匹配任何不是@符号的内容。我将以下表达式与preg_match_all()

一起使用
(?<=^|\s)@([^@\s]+)

代码:

if (preg_match_all('/(?<=^|\s)@([^@\s]+)/', $string, $matches)) {
    print_r($matches[1]);
}

要获得匹配数量,您只需使用echo count($matches[0]);

Demo