@Shimpanze

Почему не срабатывает это регулярное выражение?

Задача, найти все буквы «a», перед и после которых не идёт буква «b».

Мой код:

$str = 'a ab a ba a aab a';

$res = preg_replace_callback(
    '/.?a.?/m',
    function($matches) {
        if ( preg_match( '/ab/', $matches[0] ) ) return $matches[0];
        if ( preg_match( '/ba/', $matches[0] ) ) return $matches[0];
        return str_replace( 'a', '[совпадение]', $matches[0] );
    },
    $str
);

print $res;


Прекрасно работает, но почему-то не находит первую букву «a» в слове «aab». А ведь должен, так как перед и после неё не идёт буква «b».

Почему?
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
0xD34F
@0xD34F
Регулярному выражению .?a.? соответствует подстрока aab. Дальше вы её проверяете на соответствие выражению ab - успешно, замена не производится.

В целом, ерундой какой-то пытаетесь заниматься. Делайте так:

preg_replace('~(?<!b)a(?!b)~', '[совпадение]', $str)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы