我正在开发一个提及系统,我遇到了一个问题,当我循环并将提及更改为链接时,它将替换类似的@tom和@ tom123与/ tom /相同的链接而不是个人。
我尝试过使用regex和preg_replace但是我也在检查用户名是否确实存在,所以我只是想知道是否有办法防止它发生。
$tweet = "@wayne how are you? @wayne123 is cool but are you?";
preg_match_all('/(^|\s)@([a-z0-9_]+)/i', $tweet, $matches);
$i = 0;
foreach( $matches[2] as $value )
{
if ( $db_query )
{
$tweet = str_replace("@" . $value, "<a href=\"/user/$value\">@$value</a>!", $tweet);
}
}
echo $tweet; // outputs: hi <a href="/user/wayne">@wayne!</a> how are you? <a href="/user/wayne">@wayne!</a>123 is cool but are you?
我非常感谢任何帮助,我之前尝试使用正则表达式,但它继续沿着这条线进行更新,然后我才能检查它们是否是有效的用户
答案 0 :(得分:2)
我认为不是:
$ tweet = str_replace(“@”。$ value,“@ $ value!”,$ tweet);
您应该使用:
$tweet = preg_replace('/@' . $value.'\b/', "<a href=\"/user/$value\">@$value</a>!", $tweet);
答案 1 :(得分:0)
问题是第一次通过你的循环@ wayne123被@wayne替换,所以它无法通过循环第二次找到匹配。
将preg_replace与后引用一起使用。
$tweet = "@wayne how are you? @wayne123 is cool but are you?";
$pattern = '/(^|\s)@(\w+)/';
$replacement = '<a href="/user/$2">@$2</a>';
print preg_replace($pattern, $replacement, $tweet);
<{1>} $replacement
$2
替换为第二组括号(\w)
的匹配
请注意,(\w)
是([a-zA-Z0-9_])
答案 2 :(得分:0)
添加空格?
$tweet = str_replace("@" . $value." ", "<a href=\"/user/$value\">@$value</a>! ", $tweet);
preg_replace更有用