具有字边界和非字母数字字符的Preg_match_all

时间:2018-12-17 15:51:55

标签: php preg-match-all

如何通过".net"模式检测preg_match_all开头的点,以便也可以从echo ".net"列表中的$skills以及其他关键字开始?

$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

2 个答案:

答案 0 :(得分:0)

有两个问题:

  1. “。net”在正则表达式中的意思是“一个四个字母的单词,从任何字符开始,然后是字符n,e,t”。这是因为.是一个特殊的Match-all运算符。

  2. 问题是使用\b的意思是“在单词边界后开始下一个匹配”,因此本质上\b导致点被跳过。

    < / li>

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

请注意,点是转义符(ASP.NET),因为它是正则表达式中的特殊“全部匹配”运算符。

答案 1 :(得分:0)

知道了

$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: Microsoft

点击user3783243的链接以获取更多信息。