首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与符号词完全匹配的正则表达式

与符号词完全匹配的正则表达式
EN

Stack Overflow用户
提问于 2019-11-25 13:20:43
回答 1查看 58关注 0票数 1

我怎么能不与“软件”本身相匹配,而只能与“软件与框架”相匹配?

代码语言:javascript
复制
$skill = array("software & framework","communication skills","technology-based","software","technology");

$text = "software & framework and technology-based and excel technology- communication";

foreach ($skill as $skills) {

preg_match_all("~(?<![\w-])" . preg_quote($skills) . "(?![\w-])~i", $text, $matchWords);

foreach ($matchWords[0] as $matchWord) {

echo "<b>MatchWord:</b> " . $matchWord.  "<br>";

}

当前结果:

  • MatchWord:软件与框架
  • MatchWord:基于技术的
  • MatchWord:软件

预期结果:

  • MatchWord:软件与框架
  • MatchWord:基于技术的
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-25 13:31:44

您需要动态地构建一个具有变化的模式:

代码语言:javascript
复制
$pattern = '~(?<![\w-])(?:' . implode('|', array_map(function($i) {
     return preg_quote($i, '~');
}, $skill)) . ')(?![\w-])~i';

然后,您可以提取匹配:

代码语言:javascript
复制
if (preg_match_all($pattern, $text, $matchWords)) {
  print_r($matchWords[0]);
}

输出:Array ([0] => software & framework [1] => technology-based )

注意到:如果$skill数组中的迭代没有按降序按长度排序,则需要事先使用以下方法进行排序:

代码语言:javascript
复制
usort($skill, function($a, $b) {
    return strlen($b) - strlen($a);
});

全PHP演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59032816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档