我正在制作一个提及脚本,当在新闻文章或其他内容中提及用户个人资料链接时,该脚本会获得用户个人资料链接。我已完成提及脚本,但它在找到空格后拆分用户名。当用户想要提及某人时,他们将使用@符号开始他们的名字。
所以我的脚本在找到空格后停止。这意味着如果我想提及像@This这样的用户名。它只会拿起这个。
有人能告诉我如何获取带空格的用户名吗?这是我的剧本。
<?php
$string = "I'm wanting to speak to the user @This is please.";
$explosion = explode("@", $string);
$count = count($explosion);
for($i = 0; $i < $count; $i++){
$explosion2 = explode(" ", $explosion[$i]);
$explosion2 = $explosion2[0];
$string = str_replace("@{$explosion2}", "{$explosion2} yeah", $string);
}
echo $string;
?>
谢谢。
答案 0 :(得分:2)
如果有两个用户名为“This”和“This is”并且你有一个文本:“@这是,你觉得@This是认真的吗?”
我的建议是禁止用户名中的空格。在许多其他情况下(例如,URL创建),它可能会造成比它的价值更多的麻烦。
答案 1 :(得分:1)
无法确定用户名是否只是您示例中的一个单词或多个单词,因为用户名与字符串的其余部分具有完全相同的格式。有几种方法可以解决这个问题。
你在@上爆炸然后阅读,直到你到达用户名结尾的某个指示符。因此,需要更改字符串以在用户名的开头和结尾处具有特殊指示符:
$string = "I'm wanting to speak to the user @This is@ please.";
这对你来说非常方便,因为你只需要调用一次爆炸,因为整个用户名都在数组的第二个元素中。
答案 2 :(得分:1)
你有办法查找名字吗?我的意思是,您需要能够排除This is
(甚至是This is please
)才能找到用户This
(如果那是预期的用户)。
天真的实现将在@
字符和用户名中无效的第一个字符(例如.
)之间提取字符串。这将给出字符串This is please
。然后,您可以一次砍掉一个单词,看看用户名是否匹配。
但是,如果用户This
存在,则此策略不允许我在字符串"@This is not me."
中提及用户This is
。
为了解决这个问题,对于用户名,应该明确提及。这可以通过分隔符(本身不属于用户名的字符)来实现,例如:
I'm wanting to speak to the user [This is] please.
也请参阅@Jons' answer。
答案 3 :(得分:0)
你必须编辑这一行:
$explosion2 = explode(" ", $explosion[$i]);
另外,它只会得到第一个字。如果你想要所有的名字直到一个点,例如这样做:
$explosion2 = explode(".", $explosion[$i]);
答案 4 :(得分:0)
你做不到。通常用户名不包含空格。
答案 5 :(得分:0)
您肯定需要使用回调并需要一些方法来确定用户名是否存在。你无法从单词中猜出来。为简单起见,我更喜欢这里的正则表达式回调:
$str= preg_replace_callback('/@(\w+)( \w+)?( \w+)?/', 'rx_users', $str);
function rx_users($match) {
list($asis, $one, $two, $three) = $match;
if (user_exists($user=$one)
or user_exists($user="$one$two")
or user_exists($user="$one$two$three"))
{
return "<a href=user/$user>$user</a>";
}
else return $asis;
}
因此,如果没有user_exists()
测试,它就无法运行。但是,您当然可以回避假设用户名默认为@$one
个字。
答案 6 :(得分:0)
我相信这个问题的解决方案是在注册时为每个注册用户分配一个唯一的数字标识符。 然后可以通过用户名和/或其真实姓名引用每个用户 - 在第一个和第二个名称之间有或没有空格。
以@开头的字符串会启动搜索列表中的所有用户,然后可以从Facebook或Twitter下拉菜单中选择。