1

私は前にRTなしですべての言及に一致する必要があります。追加してみました!rtを無効にしますが、機能しません。

preg_match( '/\b!rt\s*@([a-zA-Z0-9_]{1,20})/i', $string, $data );

これは一致する必要があります:'こんにちは@userお元気ですか'。
これではありません:'RT@userお元気ですか'

ユーザー名などを抽出しようとはしていません。必要なのは、テキストにRTなしの@userがあるかどうかを知ることです。

何か案は?

4

3 に答える 3

3

!正規表現で「否定」しません。それはリテラルに一致し!ます。あなたが望むのは「否定的な後読み」です。

/(?<!RT)\s@([a-z0-9]{1,20})/i

(?<!RT)「RT」が前に付いていないことを意味します。

これはユーザー名と一致しますが、「RT」は一致として含まれません。

$match = preg_match('/(?<!RT)\s@([a-z0-9]{1,20})/i', $string);

の場合、文字列$match0「RT @user ...」だったことを意味します。でない場合$match0、文字列が「RT @user」で始まっていないことを意味します。

デモ: http://ideone.com/bOWbu

正規表現ルックアラウンドの詳細: http://www.regular-expressions.info/lookaround.html

于 2012-05-24T16:22:20.030 に答える
0

私はこれがそれを行うべきだと信じています:

$string1 = 'hello @user how are you';
preg_match('~\s?(?<!RT) @[a-z0-9]+~i', $string1, $data);
print_r($data);
// array('0' => '@user');

$string2 = 'RT @user how are you';
preg_match('~\s?(?<!RT) @[a-zA-Z0-9]+~', $string2, $data);
print_r($data);
// empty array
于 2012-05-24T16:33:32.127 に答える
0

ユーザー名を一致させたいだけの場合は、試すことができます/(?<!RT)(@.*?)(?=\s)/i

于 2012-05-24T16:25:52.980 に答える