Шаблон для проверки одиночной окклюзии в preg_match_all

Я пишу функцию, которая должна извлекать все вхождения, которые я передаю. Я итальянский, поэтому я думаю, что я мог бы быть более ясным с примером. Я бы проверить, содержит ли моя фраза некоторые плоды.

Итак, давайте посмотрим мой PHP-код:

$pattern='<apple|orange|pear|lemon|Goji berry>i'; $phrase="I will buy an apple to do an applepie!"; preg_match_all($pattern,$phrase,$match); 

результатом будет массив с «яблоком» и «applepie».

Как я могу искать только точное происхождение? Чтение руководства, которое я нашел: http://php.net/manual/en/regexp.reference.anchors.php

Я пытаюсь использовать \A , \Z , ^ и $ но никто, кажется, не работает правильно в моем случае!

Кто-то может мне помочь?

EDIT: после ответа @ cris85 я попытаюсь улучшить свой вопрос … Моя действительно картина содержит более 200 случайностей, а фраза – более 10000 символов, поэтому реальный случай слишком велик, чтобы вставлять сюда.

После некоторых испытаний я обнаружил ошибку в «обмене Microsoft Exchange»! Есть некоторые специальные символы, которые я должен убежать? В настоящий момент я убегаю "+" "-" ". "?" «$» и «*».

Анкеры, которые вы пытались использовать, предназначены для полной строки, а не для слова. Вы можете использовать word boundaries для соответствия отдельным словам. Это должно позволить вам найти только полные фруктовые спички:

 $pattern='<\b(?:apple|orange|pear|lemon|Goji berry)\b>i'; 

« ?: Это значит, что вы не создаете дополнительную группу захвата, это группа non-capture group .

Вот определение из регулярных выражений для того, что соответствует границам:

  • Перед первым символом в строке, если первый символ является символом слова.
  • После последнего символа в строке, если последний символ является символом слова.
  • Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

PHP Demo: https://3v4l.org/h5GCf

Демо-версия Regex: https://regex101.com/r/5aBaMO/1/