0

假设我有一个文本,

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

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 回答
0

按照这篇关于替换主题标签和提及的教程,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);
于 2014-02-28T09:05:02.327 回答