шаблон соответствия preg_match со звездочкой (*) в нем - PullRequest
5 голосов
/ 07 июля 2011
preg_match('/te**ed/i', 'tested', $matches);

выдает мне следующую ошибку:

ОШИБКА: нечего повторять со смещением 3

Что мне сделать, чтобы шаблон действительно содержал *?

Ответы [ 3 ]

7 голосов
/ 07 июля 2011

Чтобы использовать буквальные звездочки, вы должны избегать их с обратной косой чертой.Для сопоставления с литералом te**ed вы должны использовать такое выражение:

preg_match('/te\*\*ed/i', 'tested', $matches); // no match (te**ed != tested)

Но я сомневаюсь, что это то, что вы хотели.Если вы имеете в виду, соответствует любой символ, вам нужно использовать .:

preg_match('/te..ed/is', 'tested', $matches); // match

Если вам действительно нужны любые две строчные буквы, то это выражение:

preg_match('/te[a-z]{2}ed/i', 'tested', $matches); // match
1 голос
/ 07 июля 2011

Помещение обратной косой черты перед любым символом скажет PHP, что символ должен быть взят как есть, а не как специальный символ регулярного выражения.Итак:

preg_match('/te\\**ed/i', 'tested', $matches);
0 голосов
/ 23 июня 2016

Если вы хотите использовать поиск по типу звездочки, вы можете использовать следующую функцию:

function match_string($pattern, $str)
{
  $pattern = preg_replace('/([^*])/e', 'preg_quote("$1", "/")', $pattern);
  $pattern = str_replace('*', '.*', $pattern);
  return (bool) preg_match('/^' . $pattern . '$/i', $str);
}

Пример:

match_string("*world*","hello world") // returns true
match_string("world*","hello world") // returns false
match_string("*world","hello world") // returns true
match_string("world*","hello world") // returns false
match_string("*ello*w*","hello world") // returns true
match_string("*w*o*r*l*d*","hello world") // returns true
...