1

次のコードがあります。

$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

私の質問はなぜですか?文字列に 2 回一致するのはなぜですか? 私の正規表現の何が問題なのですか

4

2 に答える 2

3

preg_match()3 番目のパラメーターとして指定した配列に一致を格納します。この場合、preg_match()ステートメントは次のようになります。

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

したがって$matches、すべての一致が含まれます。ここで:

  • $matches[0]完全なパターンに一致したテキストが含まれます
  • $matches[1]最初のキャプチャ グループと一致するテキストが含まれます
  • $matches[2]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]);です。

デモ

于 2014-04-24T11:59:02.207 に答える