2 回答

TA貢獻1810條經(jīng)驗 獲得超4個贊
我可能會改用以下查詢:
SELECT skills
FROM weighted_skills_industry
WHERE
industry = 'Engineering' AND
skills REGEXP CONCAT('[[:<:]]', ?, '[[:>:]]')
ORDER BY
LENGTH(skills) DESC
LIMIT 3000;
對于?占位符,您可以綁定$textPHP 代碼中的變量。上述邏輯將返回文本中可以找到的所有技能。

TA貢獻1921條經(jīng)驗 獲得超9個贊
如果我理解正確,您將從數(shù)據(jù)庫中獲取技能列表(作為關鍵字數(shù)組),并希望檢查字符串是否$text包含這些單詞中的任何一個。
您現(xiàn)在使用的可能是要走的路,但我懷疑如果您有數(shù)千個這樣的單詞,您是否可以縮短正則表達式。
您可以簡單地遍歷關鍵字并對每個關鍵字執(zhí)行正則表達式檢查。這有點慢,但只要找到任何單詞(如果需要),您就可以打破循環(huán):
foreach ($skills as $skill) {
if (preg_match('~(?<![\w-])(?:' . preg_quote($skill, '~') . ')(?![\w-])~i', $text, $matches)) {
// do stuff with $matches[0] (found keyword)
// ...
break; // <- if finding one of these words is enough
}
}
請注意,您還可以\b在正則表達式中使用來檢查單詞邊界??紤]:
\bword\b
代替:
(?<![\w-])word(?![\w-])
或者,有一些方法可以增加模式大小限制,但您必須重新編譯 PHP。
- 2 回答
- 0 關注
- 117 瀏覽
添加回答
舉報