-1

正規表現を使用して、次のPHPコードを使用してTwitterストリームで@replyを検出しています。

$text = preg_replace('!^@([A-Za-z0-9_]+)!', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);
$text = preg_replace('! @([A-Za-z0-9_]+)!', ' <a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);

email@domain.comに返信として誤ったフラグを立てることなく、これら2つのルールを最適に組み合わせるにはどうすればよいですか?

4

7 に答える 7

4

OK、考え直して、whatever@email にフラグを立てないということは、前の要素が「単語以外」の項目でなければならないことを意味します。 :

!(^|\W)@([A-Za-z0-9_]+)!

ただし、$1 の代わりに $2 を使用する必要があります。

于 2009-02-09T21:17:30.173 に答える
2

^は RE の先頭に立つ必要がないため、グループ化を使用してそれらの RE を組み合わせることができます|

キャプチャした空白を再挿入したくない場合は、「肯定的な後読み」を使用する必要があります。

$text = preg_replace('/(?<=^|\s)@(\w+)/',
    '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);

または「否定後読み」:

$text = preg_replace('/(?<!\S)@(\w+)/',
    '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);

...どちらかが理解しやすいと思います。

于 2009-02-09T21:45:24.303 に答える
0

これが私が組み合わせを行う方法です

$text = preg_replace('!(^| )@([A-Za-z0-9_]+)!', '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text);
于 2009-02-09T21:15:45.063 に答える
-1
preg_replace('%(?<!\S)@([A-Za-z0-9_]+)%', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);

(?<!\S)大まかに「先行する非空白文字なし」に変換されます。一種の二重否定ですが、文字列/行の先頭でも機能します。

これは、先行する文字を消費せず、キャプチャグループを使用せず"foo-@host.com"、有効な電子メールアドレスであるなどの文字列と一致しません。

テスト済み:

Input = 'foo bar baz-@qux.com bee @def goo@doo @woo'
Output = 'foo bar baz-@qux.com bee <a href="http://twitter.com/def" target="_blank">@def</a> goo@doo <a href="http://twitter.com/woo" target="_blank">@woo</a>'
于 2009-02-09T21:26:31.980 に答える
-1
$text = preg_replace('/(^|\W)@(\w+)/', '<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text);
于 2009-02-09T21:36:12.487 に答える
-2

フー、みんな、あまり遠くに押し込まないでください...ここにあります:

!^\s*@([A-Za-z0-9_]+)!
于 2009-02-09T21:28:53.987 に答える
-2

代替を使用できると思います。文字列またはスペースの先頭を探します

'!(?:^|\s)@([A-Za-z0-9_]+)!'
于 2009-02-09T21:24:32.780 に答える