1

我的移动应用程序就像一个移动平台(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!                 
            }

        }   
    }
}

你会建议做什么?

4

1 回答 1

2

而不是使用正则表达式来替换您不想匹配的所有内容,您应该能够立即匹配任何带有 @ 之前的单词。

$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-]+/

于 2013-11-11T20:23:36.550 回答