我有以下代码:
$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
我的问题是为什么?为什么它与字符串匹配两次?我的正则表达式有什么问题
答案 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]);
。