我正在尝试构建一个PHP代码来检测类似Twitter的提及,但不是链接到@username,而是找到用户的ID并引用它。
function get_user_id_from_username($username) {
$username = sanitise($username);
return mysql_result(mysql_query("SELECT user_id FROM users WHERE user_sitename = '$username'"), 0, 'user_id');
}
$string = sanitise($_POST['updatetext']);
$explosion = explode("@", $string);
$count = count($explosion);
for($i = 0; $i < $count; $i++){
$explosion2 = explode(" ", $explosion[$i]);
$explosion2 = $explosion2[0];
$username_id = get_user_id_from_username($explosion2);
$string = str_replace("@{$explosion2}", "<a href='profile.php?id={$username_id}'>{$explosion2}</a>", $string);
}
我遇到的问题是只有在@username后面没有标点符号时才会检测到用户名,但是如果$ update等于“Hello @username,你还好吗?”查询将找不到等于“username”的用户名,因此会抛出错误。
一旦有任何标点存在,我有没有办法结束爆炸?所以,而不是$ explosion2等于“用户名”,它等于“用户名”?
答案 0 :(得分:2)
不要使用explode
,而是执行:
preg_match_all('/@[A-Za-z]+/',$string,$usernames);
这将为您提供一系列用户名$usernames
,您可以将其循环以进行数据库查找。请注意,用户名将包含@
- 您需要在执行查找之前将其删除。
我假设用户名完全由字母组成 - 如果你想允许数字或其他字符只是相应地调整正则表达式。
答案 1 :(得分:0)
您可以使用PHP的trim()函数删除所有标点符号: http://php.net/manual/en/function.trim.php
即:
$explosion2 = trim($explosion2, ",.");
答案 2 :(得分:0)
你可以像这样使用它:
preg_split('/[.,;?!]/',$mystring);
其中mystring是用户输入的内容,可以在代码中添加[]之间的所有标点符号。或者你只需要替换字符串:
u can also remove the punctuations with preg_replace
preg_replace("/[^@[a-zA-Z 0-9]]+/", " ", $mystring);
然后获取链接并放置原始字符串中的标点符号...以及您可以想到的许多调整..