1

我正在尝试构建一个 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,你还好吗?” 查询不会找到等于“用户名”的用户名,因此会引发错误。

一旦存在任何标点符号,有什么方法可以结束爆炸吗?所以不是 $explosion2 等于“用户名”,而是等于“用户名”?

4

3 回答 3

2

而不是使用explode,只需执行以下操作:

preg_match_all('/@[A-Za-z]+/',$string,$usernames);

这将为您提供一组用户名,$usernames然后您可以循环进行数据库查找。请注意,用户名将包括@- 您需要在查找之前将其删除。

我假设用户名完全由字母组成——如果你想允许数字或其他字符,只需相应地调整正则表达式。

于 2013-05-22T00:05:29.443 回答
0

您可以使用 PHP 的 trim() 函数删除所有标点符号: http: //php.net/manual/en/function.trim.php

IE:

$explosion2 = trim($explosion2, ",.");
于 2013-05-21T23:53:50.787 回答
0

你可以像这样使用它:

preg_split('/[.,;?!]/',$mystring);

其中 mystring 将是用户在 u 中键入的内容,可以在代码中的 [] 之间添加所有标点符号.. 或者您可以只替换字符串:

u can also remove the punctuations with preg_replace
preg_replace("/[^@[a-zA-Z 0-9]]+/", " ", $mystring);

然后获取链接并从原始字符串中放置标点符号..以及您可以想到的许多调整..

于 2013-05-22T00:04:35.213 回答