Php 正则表达式模式-匹配以@

Php 正则表达式模式-匹配以@,php,regex,replace,preg-replace,Php,Regex,Replace,Preg Replace,我的移动应用程序就像移动平台上的论坛(WP7、Silverlight、.NET)。其中一个功能是通过在用户名后面写“@”字符来标记其他用户 在服务器端,PHP,我正在解析文本,使其与标记匹配,并用更可读的字符串替换它们,例如[tag](display name)|(user id)[/tag],但这对于我们的目的并不重要 为了匹配标记,我用空格替换了所有特殊字符,这样我就可以像@名称,.。然后,我将删除前一个命令可能创建的所有多个空间。最后,我将每个空格分开,然后检查单词是否以“@”字符开头。

我的移动应用程序就像移动平台上的论坛(WP7、Silverlight、.NET)。其中一个功能是通过在用户名后面写“@”字符来标记其他用户

在服务器端,PHP,我正在解析文本,使其与标记匹配,并用更可读的字符串替换它们,例如
[tag](display name)|(user id)[/tag]
,但这对于我们的目的并不重要

为了匹配标记,我用空格替换了所有特殊字符,这样我就可以像
@名称,.
。然后,我将删除前一个命令可能创建的所有多个空间。最后,我将每个空格分开,然后检查单词是否以“@”字符开头。 这当然不是最好的方法,但这正是我迄今为止努力做到的。有一个弱点,新行字符使我的代码失败。例如:

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\u xd),如果您想在有效匹配(例如@user1a-12)中包含
-
(破折号),那么$pattern将是
/[\w-]+//code>

预期的输出是什么?您还可以使用
[^a-zA-Z0-9@]+
更改第一个正则表达式,并完全删除第二个正则表达式。总之+1:)看看OGHaza的答案,它很有效,我想知道预期的输出。我知道这是可行的,所以我投了更高的票。这里的replace标记有点误导……好吧,输出应该是@char和特殊字符(如逗号、空格和新行)之间的字符串。就是这样。但是,我无法循环浏览匹配列表。MatchCollection是字符串数组,不是吗?
$matches[0]
代码中是(字符串)匹配数组<代码>$matches[0][0]='@name'$匹配[0][1]=“@hello”。我忘了指定它必须查看的数组([0])。谢谢你的帮助!注意:在事后看来<代码> \b@ \W+将是一个更好的正则表达式,因为它避免了在单词的中间匹配<代码> @ /代码>。