6

@メンションのすべての出現をアンカータグに置き換えようとしていますが、これまでのところ:

$comment = preg_replace('/@([^@ ])? /', '<a href="/$1">@$1</a> ', $comment);

次のサンプル文字列を見てください。

"@name kdfjd fkjd as@name @ lkjlkj @name"

これまでのところすべて一致していますが、その単一の「@」記号は無視したいと思います。"[^@ ]" の後に "+" と "{2,}" を使用してみました。

4

6 に答える 6

10

疑問符 ( ?) 量指定子 (「オプション」) を置き換え、+文字クラスの後に (「1 つ以上」)を追加します。

@([^@ ]+)
于 2012-04-30T13:02:30.480 に答える
7

正規表現

(^|\s)(@\w+)

あなたが求めているものかもしれません。

これは基本的に、行頭またはスペースの後に @ 記号が続き、1 つ以上の単語文字が続くことを意味します。

例えば

preg_match_all('/(^|\s)(@\w+)/', '@name1 kdfjd fkjd as@name2 @ lkjlkj @name3', $result);
var_dump($result[2]);

あなたにあげる

Array
    (
        [0] => @name1
        [1] => @name3
    )
于 2012-04-30T13:08:49.787 に答える
3

と置き換える?+機能しますが、期待どおりには機能しません。

@nameあなたの式は、文字列の末尾で一致しません。

$comment = preg_replace('#@(\w+)#', '<a href="/$1">$0</a> ', $comment);

これはあなたが望むことをするはずです。\w+文字を表します (a-zA-Z0-9)

于 2012-04-30T13:16:33.077 に答える
0

試す:

'/@(\w+)/i'

于 2012-04-30T13:03:18.557 に答える