0

私はテキストを持っているとしましょう、

$text = '@stackguy @flowguy I need to learn more advanced php #ilovephp';

@stackguy と @flowguy の両方をそれぞれ 2 つのアンカー タグに置き換えたいと思います。これは、テキスト文字列内の任意の数の @ に対しても機能するはずです。

<a href="url/stackguy">@stackguy</a>
<a href="url/flowguy">@flowguy</a>

#ilovephp も置き換えたい

<a href="search/ilovephp">#ilovephp</a>

複数の # に対しても機能するはずです。みたいな感じになると思います

preg_replace_callback('regex',
            create_function('$matches', '
                switch ($matches[1]) {
                    case "@":
                        return "<a href=url.$matches[2]'/'>" . $matches[2] . "</a>";
                    case "#":
                        return "<a>" . $matches[2] . "</a>";
                }
        '), $var);

正規表現はどのようになりますか? 私の関数は必要なものすべてに一致しますか、それとも foreach ループを追加する必要がありますか? ありがとう。

4

3 に答える 3

1

@ または # が前に付いたテキストと一致させたくない場合は、次のようにします。/([@#])(\S+)/

このデモを見る: http://regex101.com/r/eP7eU0

注: タグ内にある場合、これは同じものと一致します。それが望ましくない場合は、正規表現以上のものが必要になります。

于 2013-01-09T16:46:34.903 に答える
1

preg_replace()どちらも、preg_replace_callback()デフォルトでは、可能なすべての一致を検索するため、ループは必要ありません。

これらの値がまだアンカーによってラップされていないことを考慮して、どちらかを使用します

preg_replace('~@([^\s#@]+)~','<a href="url/\1">$0</a>',
    preg_replace('~#([^\s#@]+)~','<a href="search/\1">$0</a>',$text)
);

また

preg_replace_callback('~([#@])([^\s#@]+)~',create_function('$m',
    '$dir = $m[1] == "#" ? "search" : "url";' .
    'return "<a href=\"$dir/$m[2]\">$m[0]</a>";'
),$text);
于 2013-01-09T17:21:09.313 に答える