在post中preg replace_callback提及和主题标签

时间:2013-01-09 16:38:58

标签: php regex preg-replace preg-replace-callback

假设我有一个文字,

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

我想分别用这两个锚标签替换@stackguy和@flowguy。这也适用于文本字符串中任意数量的@。

<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循环? 感谢。

3 个答案:

答案 0 :(得分:1)

如果您不想匹配@或#之前的文字,请使用此/([@#])(\S+)/

观看此演示:http://regex101.com/r/eP7eU0

注意:当它在内部标签时,这将匹配相同的东西。如果你不想那样,那么你需要的不仅仅是正则表达式。

答案 1 :(得分: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);

答案 2 :(得分:0)

tutorial on replacing hashtags and mentions之后,preg_replace()就足够了。

$patterns = array('/#(\w+)/', '/@(\w+)/');
$replacements = array('<a href="http://example.com/tag/$1">#$1</a>', 
                '<a href="http://example.com/user/$1">@$1</a>');

$html = preg_replace($patterns, $replacements, $text);