Вы можете разбить строку на «предложения» (разделить на точку (как насчет восклицательных знаков, вопросительных знаков, ...)).
Затем найдите предложение с соответствующим словом.
Затем разбейте это предложение на «слова» и добавьте несколько тегов в два слова до и после соответствующего слова. Поскольку у вас есть только одно предложение для работы, вы должны включить проверку, чтобы убедиться, что вы не вышли за пределы массива слов.
Затем соедините слова вместе и соедините все предложения вместе.
В качестве альтернативы, вы можете использовать регулярные выражения и preg_replace
(хотя это может быть не та дорога, по которой вы хотите идти, особенно если у вас есть такая опция, как разделение на открытый текст - есть цитата, которая идет что-то вроде «У вас есть проблема, и вы хотите использовать для этого регулярное выражение. Теперь у вас есть две проблемы.»):
$string = preg_replace("/\\b(\\w+ +){0,2}$query( +\\w+){0,2}\\b/i",
'<strong>$0</strong>',
$string);
Регулярное выражение работает следующим образом (обратные слэши экранируются выше):
\b | match a word boundary (ie match whole words)
(\w+ +) | match a "word" followed by spaces (to separate it from the next word)
{0,2} | match 0 to 2 of these such words (it will match as many as possible
| up to 2)
$query | match the '$query' string
( +\w+) | regex for space (separating $query) followed by a word
{0,2} | match 0 to 2 of these words (as many as possible up to 2)
\b | match a word boundary (ie match whole words)
/i
в конце означает «без учета регистра».
Строка замены <strong>$0</strong>
означает замену всеми подобранными словами, заключенными в теги 'strong'.
Причина, по которой это работает, состоит в том, что регулярное выражение не допускает совпадения полной остановки . Таким образом, он будет захватывать до 2 слов по обе стороны от $query
, но ему запрещено проходить через все остановки.
Есть обычные предостережения (которые вы применили бы к любому методу, который использовали) - хотите, чтобы жирный шрифт проходил через вопросительные знаки? восклицательные знаки? Допускается ли апостроф одним словом? Что вы будете делать с пунктуацией без остановок между словами? и т.д.
Я бы порекомендовал уточнить вышеупомянутое регулярное выражение (если вы хотите использовать регулярное выражение, то есть):
- разрешить апострофы в слове: измените
\w+
на [\w']+
(не используйте обратную косую черту для PHP)
- разрешить различные знаки препинания между словами: заменить
+
на что-то вроде [\s\-&,]+
(означает, что между словами допускаются "пробел", "-", "&", "," - добавьте больше по своему вкусу, но не ставьте «.», чтобы жирный шрифт не проходил через полные остановки).