Я нахожусь на моей последней части этого проекта клиента, и у меня есть одна последняя проблема от тестирования и отладки. Проблема заключается в сопоставлении на основе базового слова для выделения.
Например, поисковым словом является «контракт», а искомый текст может содержать «контракты, контракты, контракты», которые должны совпадать и выделяться. Однако мне также нужна обратная сторона, поисковое слово может быть «свернуто», а искомый текст — «контракт».
Текст для поиска поступает из БД, и мой SQL вводит правильные записи, я также сократил его до пары предложений для предварительного просмотра. Я попытался возиться с некоторыми идеями, такими как сопоставление по длине слова, например «/ [контракт] {8,} /», «контракты», что работает в первой части примера.
Вот пример кода:
//Get Preview Of Found Records
$RecordFound = $Title;
$SearchInput = $TestText;
$RegExPattern = preg_quote($SearchInput, '/');
$RegExPattern = "/^.*$RegExPattern.*\n.*\n.*\$/m";
if(preg_match_all($RegExPattern, $RecordFound, $matches)){
echo $PostID." - Area = ".$AreaPK." Type = ".$TypePK;
echo "<br/>";
//Send Preview For Highlighting
echo highlight(implode("\n", $matches[0]), $SearchInput);
echo "<br/>";
}
function highlight($text, $words) {
preg_match_all('~\w+~', $words, $m);
if(!$m)
return $text;
$re = '~\\b(' . implode('|', $m[0]) . ')\\b~i';
return preg_replace($re, '<SPAN style="BACKGROUND-COLOR: #ffff00"><b>$0</b></SPAN>', $text);
}
Спасибо,
Дейв
Вы можете использовать следующее, чтобы найти полное слово (все до пробела \ новой строки)
(contract[^\s,.]*)
Посмотреть https://regex101.com/r/SbhZGo/2 Например
В вашем случае вы можете просто заменить контракт на любые слова, например:
(ball[^\s,.]*)
найдете мяч, шары, воздушный шар и т. д.
Других решений пока нет …