【问题标题】:Get name from hashtag using regex使用正则表达式从主题标签中获取名称
【发布时间】:2012-10-11 04:51:08
【问题描述】:

我有这个字符串/内容:

@Salome@Jessi H@O'Ren 正在@Lean 的院子里玩“@Ziggy”鼠标。

好吧,我试图让所有名称都集中在上面。我已经使用@ 符号来创建像在我的网络中使用的散列一样。如果您注意到,在@Jessi H 之类的名称和@Ziggy 之类的前后字符之间存在空格。因此,如果您建议我以另一种方式管理哈希以使其正常工作,我不同意。我在想,对于有空格的用户,可以用@"Jessi H" 之类的引号写散列。你怎么看?其他例子:

@Lean's => @"Lean"'s  
@Jessi H => @"Jessi H"  
"@Jessi H" => (sorry, I don't know how to parse it)  
@O'Ren => @"O'Ren" 

我有什么? 我开始在 php 中使用正则表达式,但是一些 SO 问题对我开始很有用,所以,这些是我首先使用 preg_match_all 函数的尝试:

/@(.*?)[,\" ]/ 的结果:

Array ( [0] => Salome [1] => Jessi [2] => Charlie [3] => Lean's [4] => Ziggy" ) )

/@"(.*?)"/ 的结果,如 @"name"

Empty array

伙计们,我不希望你们为我做这一切。我认为伪代码或类似的东西将有助于引导我走向正确的方向。

【问题讨论】:

  • 您是在打印这些数据,还是用户输入的?
  • 嗨,我只是通过print_r($hashes)preg_match_all($regex, $content, $hashes);打印出来
  • 但是您要搜索的字符串的来源是什么?
  • @circusdei,我的文笔很糟糕,抱歉,这不是我的母语……嗯。我已经更新了帖子

标签: php regex hashtag


【解决方案1】:

试试下面的正则表达式:'/@(?:"([^"]+)|([^\b]+?))\b/'

这将返回两个匹配组,第一个包含任何带引号的名称(例如 @"Jessi H"@"O'Ren"),第二个包含任何不带引号的名称(例如 @Salome@Leon

$matches = array();
preg_match_all('/@(?:"([^"]+)|([^\b]+?))\b/', '@Salome, @"Jessi H" and @"O\'Ren" were playing at the @Lean\'s yard with "@Ziggy" the mouse.', $matches);
print_r($matches);

输出:

Array
(
    [0] => Array
        (
            [0] => @Salome
            [1] => @"Jessi H
            [2] => @"O'Ren
            [3] => @Lean
            [4] => @Ziggy
        )

    [1] => Array
        (
            [0] => 
            [1] => Jessi H
            [2] => O'Ren
            [3] => 
            [4] => 
        )

    [2] => Array
        (
            [0] => Salome
            [1] => 
            [2] => 
            [3] => Lean
            [4] => Ziggy
        )

)

【讨论】:

  • 嗨,非常感谢。我不知道正则表达式有多强大。但是,我使用了你的正则表达式,@"Jessi H" 剧照只得到Jessi,而对于@"O'Ren",我只得到O
  • 我修复了几分钟前引入的错误并更新了答案,您可以再试一次吗?
  • 我已经复制/粘贴了您的代码,但它不起作用。不过,你为我做了很多。非常感谢!
  • 嘿,三个小时后我收到错误:这不是你的!这是我的。出于某种原因,在后台运行了一个脚本,使我的符号消失了。嘿!非常感谢,您的正则表达式运行完美。 :)
  • 哎哟!它发生在我们最好的人身上。乐意效劳! :)
【解决方案2】:

您是在设置这些要求还是可以选择它们?如果您可以设置要求,我建议使用_ 而不是空格,这样您就可以使用正则表达式:

/@(.+) /

如果必须允许空格并且您要使用引号,那么引号应该可能跨越整个名称,允许使用这个正则表达式:

/@\"(.+)\" /

【讨论】:

  • 嗨。好吧,网络上的用户喜欢使用带空格的名称,所以我尽量保留空格。如果没有......我们会看到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
相关资源
最近更新 更多