我的移动应用程序就像移动平台(WP7,Silverlight,.NET)上的论坛一样。一种功能是通过写“ @”字符和用户名来标记其他用户。
在服务器端,PHP,我正在解析文本,以便它与标记匹配,并用更具可读性的字符串(例如)替换它们[tag](display name)|(user id)[/tag]
,但这对我们的目的并不重要。
为了匹配标签,我将所有特殊字符替换为一个空格,以防止出现此类情况.... @name, ....
。然后,我将删除本可以创建上一个命令的所有多个空格。最后,我将每个空格分开,然后检查该单词是否以“ @”字符开头。这当然不是最好的方法,但是到目前为止,这是我设法做到的。有一个弱点,换行符会使我的代码失败。例如:
Hello, this is my first line
since I go to second and then I tag
@Jonh
who is a good boy
在这种情况下,我要在下面编写的代码将失败。$resp
要解析的文本在哪里。
if (strpos($resp,'@') !== false) {
$new_str = preg_replace('/[^a-zA-Z0-9_ \@]/', ' ', $resp);
$new_str = preg_replace('/\s+/', ' ', $new_str);
foreach(explode(' ', $new_str) as $word)
{
if (strpos($word, '@') === 0) {
//found my tag!
}
}
}
}
您会建议做什么?
与其使用正则表达式替换所有您不希望匹配的内容,还不如使用正则表达式将任何单词立即与@匹配。
$subject = "..blah.. @name, ..blah..@hello,blah";
$pattern = '/@\w+/';
preg_match_all($pattern, $subject, $matches);
print_r($matches);
输出:
Array ( [0] => Array ( [0] => @name [1] => @hello ) )
/@\w+/
假设只有数字,字母和下划线(即\w
匹配项)是有效的匹配项(即@ user123_xd),如果要-
在有效的匹配项中包含(破折号)(例如@ user1a-12),则$ pattern为/@[\w-]+/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句