Регулярка на php должна находить слово "культурист" либо в начале строки, либо в конце либо, если оно в середине окружено круглыми скобками например: тест1 (культурист) тест2.
Подскажите, плиз, почему не работают обратные ссылки:
$str ="культурист тест1 (культурист) тест2";
$res = preg_match("/(культурист)$|^\\1|\(\\1\)/iu", $str, $match,
PREG_OFFSET_CAPTURE);
print_r($match);
Не находит ничего (найдет только, если слово поставить в конце строки).
Для большей ясности сначала переведу Ваше регулярное выражение в одинарные кавычки:
'/(культурист)$|^\1|\(\1\)/iu'
Все дальнейшие регулярки тоже буду приводить в одинарных кавычках.
Устранение проблемыСперва дам простой способ устранения проблемы. Для ваших целей следует использовать такую регулярку:
'/(культурист)$|^(?1)|\((?1)\)/iu'
– то есть вместо обратных ссылок \1 следует использовать рекурсивные подмаски (?1). Разница в следующем:
Потестировать вживую предложенное решение можно здесь: https://regex101.com/r/3hOm5A/1 – заодно я добавил там тестовый пример со всеми кейсами.
Теперь главное: почему так происходит?В своей регулярке Вы используете обратные ссылки совместно с альтернативным выбором. Как только первая альтернатива (культурист)$ отрабатывает, начинается вторая альтернатива ^\1. При переходе от альтернативы к альтернативе все обратные ссылки как бы "обнуляются". То есть считается, что в пределах данной (второй) альтернативы ещё никакой текст для первой подмаски не был найден. Подмаска есть, но обратная ссылка уже не хранит текст, который был ей сопоставлен в предыдущей альтернативе. То же самое происходит при переходе к третьей альтернативе. Именно поэтому две последних альтернативы у Вас не работают. Они просто не имеют доступа к ранее найденному тексту.
В свою очередь моё решение использует не обратные ссылки, а рекурсивные подмаски. В данном случае первая подмаска подставляется в альтернативные ветки как есть. В результате моя регулярка становится эквивалентна следующей:
'/(культурист)$|^культурист|\(культурист\)/iu'
– именно поэтому она отлично работает.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости