【问题标题】:Preg_match_all with Word Boundary and Non-alphanumeric Characters [duplicate]Preg_match_all 与字边界和非字母数字字符[重复]
【发布时间】:2019-05-18 00:32:28
【问题描述】:

如何使用preg_match_all 模式检测".net" 开头的点,以便我还可以从$skills 列表以及其他关键字中找到echo ".net"

$skill = array(".net","software framework","microsoft");
$text = ".NET Framework is a software framework developed by Microsoft";

foreach ($skill as $skills) {
    preg_match_all("~\b$skills\b~i", $text, $matchWords);
    foreach ($matchWords[0] as $matchWord) {
        echo "<b>MatchWord:</b> " . $matchWord.  "<br>";
    }    
}      

输出(我缺少 .NET):MatchWord: 软件框架 MatchWord: Microsoft

【问题讨论】:

  • . 不是您目前写的 .
  • 我想stackoverflow.com/questions/6713310/… 会回答的。你也应该使用preg_quote3v4l.org/J8mBO
  • 您到底想用\b 做什么,而没有它就无法做到?或者你想用你的代码做什么?当你尝试解决你的问题/问题/任务时,你遇到了什么挑战?

标签: php preg-match-all


【解决方案1】:

有两个问题:

  1. “.net”在正则表达式中的意思是“一个四个字母的单词,以任何字符开头,然后是字符 n、e、t”。那是因为. 是一个特殊的全匹配运算符。

  2. 问题是使用\b 表示“在单词边界之后开始下一个匹配”,所以本质上\b 导致点被跳过。

一种可能的解决方案是将$skills 数组中的.net 更改为net,然后通过添加\.?: "~\b\.?$skills\b~i" 来匹配任何以点开头的单词。在这个版本中,\b 仍然存在,所以net 不会匹配ASP.NET

请注意,点被转义 (\.),因为它是正则表达式中的特殊“匹配所有”运算符。

【讨论】:

    【解决方案2】:

    知道了:

    $skill = array(".net","software framework","microsoft");
    $text = ".NET Framework is a software framework developed by Microsoft";
    
    foreach ($skill as $skills) {
    preg_match_all("~(?<!\S)$skills(?!\S)~i", $text, $matchWords);
    foreach ($matchWords[0] as $matchWord) {
    
         echo "<b>MatchWord:</b> " . $matchWord.  "<br>";
     }    
    }
    

    .Net 的输出: MatchWord: .NET MatchWord: 软件框架 MatchWord:微软

    点击来自 user3783243 的链接了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多