我正在尝试创建一个类似于Twitter的系统,用于提及用户并在提及时收到通知。在这里有很多问题要求类似的东西,但没有一个看起来是决定性的,并以任何方式帮助我。
我的第一个麻烦是在发布状态时解析提及,它在某种程度上起作用,但是我对使用的表达式不满意。如果我发布一个状态,例如说“@ user1 hello there its @ user2”,那么user1将正确解析,@是第一个字符,但我的user2显示空格作为解析的配置文件链接的一部分,这里是我的preg_replace和表达式:
$STRING = preg_replace('/(^|\s)(@\w+)/','<a href="profile.php?u=$0">$0</a>', $STRING);
我还需要知道如何在配置文件链接中只显示没有@的用户名,当前的$ 0也会生成@符号。
对于通知,我有一个名为alert的表,具有以下结构:
id | userid | sentby |消息|接收
消息字段包含通知消息内容。我想知道如何从我提交的表单中提取任何提及并检查用户名是否存在,然后从那里为用户创建一个警告,他们已在帖子中提到过。
答案 0 :(得分:3)
至于你的第一个正则表达式,你可以这样做:
$string = preg_replace('/(^|\s)@(\w+)/', '$1<a href="">$2</a>', $string);
这应该是没有初始空格或@符号的用户名。基本上,我们将字符串的初始空格或开头捕获到变量中,并在替换开始时将其打印出来。你在$ 2中得到的结果只是 @符号后面的内容。你也可以通过后视来实现这一目标,但我觉得这更简单。
至于你的数据库结构,可能会这样:
messages -
id | user_id | message
mentions -
message_id | user_id
对于每次提及,您都将user_id插入到消息的表中。您可以选择是实时发送警报还是等待批处理(或者可能 - 根据性能要求 - 只需通过加入表来查询用户提到的帖子)。
答案 1 :(得分:1)
我一直在考虑这个问题几个小时,虽然我有点新手,但我相信我有办法提取提及和警报并将它们存储到两个一维数组中。
<?php
//a variable ($string) that I thought might look like what you are describing
$string='@steve how are you? @tom nice to hear from you. So happy that you joined @joe, cool! @mike sweeet!';
//regex to pull out the mentions and the messages
preg_match_all('/@(\w+)|\s+([(\w+)\s|.|,|!|?]+)/', $string, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
$mention[$i]= $result[1][$i];
$message[$i]= $result[2][$i];
}
//test to make sure that all mentions are stored
for ($j = 0; $j< $i; $j++){
echo $mention[$j],'<br/>';
}
//test to make sure that all messages are stored
for ($k = 0; $k< $j; $k++){
echo $message[$k],'<br/>';
}
?>
Regex Buddy提供的解释,我使用的正则表达式:@(\ w +)| \ s +([(\ w +)\ s |。|,|!|?] +):
Match either the regular expression below (attempting the next alternative only if this one fails) «@(\w+)»
Match the character “@” literally «@»
Match the regular expression below and capture its match into backreference number 1 «(\w+)»
Match a single character that is a “word character” (letters, digits, and underscores) «\w+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Or match regular expression number 2 below (the entire match attempt fails if this one fails to match) «\s([(\w+)\s|\.|,|!|?]+)»
Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) «\s+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match the regular expression below and capture its match into backreference number 2 «([(\w+)\s|\.|,|!|?]+)»
Match a single character present in the list below «[(\w+)\s|\.|,|!|?]+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
The character “(” «(»
A word character (letters, digits, and underscores) «\w»
One of the characters “+)” «+)»
A whitespace character (spaces, tabs, and line breaks) «\s»
The character “|” «|»
A . character «\.»
One of the characters “|,!?” «|,|!|?»
这甚至会返回括号中偏移的消息中的单词(例如(hello))。您应该能够使用数组中定义的变量执行您描述的任何操作。如果这不正确,或者你无法做到,请告诉我,我会看到我能想到的。
答案 2 :(得分:1)
请查看本教程implement twitter style mention system with PHP, MYSQL and jQuery
您已使用regrex匹配从内容中提取@mentions
由于