我怎么能不与“软件”本身相匹配,而只能与“软件与框架”相匹配?
$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>";
}当前结果:
预期结果:
发布于 2019-11-25 13:31:44
您需要动态地构建一个具有变化的模式:
$pattern = '~(?<![\w-])(?:' . implode('|', array_map(function($i) {
return preg_quote($i, '~');
}, $skill)) . ')(?![\w-])~i';然后,您可以提取匹配:
if (preg_match_all($pattern, $text, $matchWords)) {
print_r($matchWords[0]);
}输出:Array ([0] => software & framework [1] => technology-based )
注意到:如果$skill数组中的迭代没有按降序按长度排序,则需要事先使用以下方法进行排序:
usort($skill, function($a, $b) {
return strlen($b) - strlen($a);
});见全PHP演示。
https://stackoverflow.com/questions/59032816
复制相似问题