【问题标题】:PHP preg_match_all : find string with "@word" or "#word" in itPHP preg_match_all : 查找包含“@word”或“#word”的字符串
【发布时间】:2014-11-14 21:53:07
【问题描述】:

让我清楚我想要实现的逻辑。

  1. 我在 DB 中有很多 cmets 和主题词
  2. 我想通过正则表达式匹配评论中的主题词。
  3. 匹配词将在 DB 上查询并获取其 topicid 并应用主题进行评论以生成标签云。

但是以“@”和“#”开头的任何单词在 preg_match_all 模式中都不起作用,例如。

$pattern = '/\b(\@abdulcollo|tuskys|\#teamBata|50\% off|baby|\@mystic_false)\b/i';

$string = 'Anga lonely everyday RT @Mystic_False: Heehe @AbdulCollo aneno ka idhi tuskys in lonely woman bana #TeamBata in Kakamega baby! @danaceda @kibalimoreithi @olivermathenge @batakenya @ Tuskys Mega Mall 50% off';

preg_match_all($pattern, $string, $matches);

var_dump($matched) 返回数组下方。

$matches = array('tuskys', 'baby', '50% off');

但我也想拥有'@abdulcollo''#TeamBata''@Mystic_False',我已经逃脱了“@ " 和 "#" 但它们仍然没有匹配...!

非常感谢任何帮助,我想要纯 PHP 的逻辑。

注意:我在为标签词创建模式时将所有内容都小写,例如,小写词也会降低整个评论字符串,所以这不是任何问题。

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    这是因为单词边界\b。非单词字符和非单词字符之间不存在单词边界。因此,将您的正则表达式更改为,

    (\B@abdulcollo|\btuskys|\B#teamBata|\b50\% off|\bbaby|\B@mystic_false)\b 
    

    【讨论】:

    • 感谢 Avinash,它正在工作另一个修复是我刚刚从我的正则表达式 (@abdulcollo|tuskys|#teamBata|50% off|baby|@mystic_false) 中删除了 \b,它现在工作正常。
    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多