Я пишу функцию, которая должна извлекать все вхождения, которые я передаю. Я итальянский, поэтому я думаю, что я мог бы быть более ясным с примером. Я бы проверить, содержит ли моя фраза некоторые плоды.
Итак, давайте посмотрим мой 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/