假设我有一个文字,
$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循环? 感谢。
答案 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);