В вашем паттерне ^#(?=[\s\S]*(cat))(?=[\s\S]*(ugly))^#
вы используете совпадение #
с начала строки ^#
, затем 2 положительных прогноза и затем снова совпадение ^#
.Вот почему вы не получаете совпадение.
Чтобы получить более точное совпадение, вы можете начать шаблон с ^# cat B
Если вы хотите использовать lookaheads, вы можете использовать 2захват групп в позитивном взгляде.Если вы хотите искать кошку и уродливые слова целиком, вы можете использовать границы слов \b
.
(?s)
- это модификатор, который разрешает точку, совпадающую с новой строкой, для которой вы также можете использовать /s
вместо этого в качестве флага.
(?s)(?=^# cat B.*?(cat).*?(ugly).*?^# cat C
Regex demo
Но может быть проще не использовать упущение и сопоставлять вместо:
(?s)^# cat B.*?(cat).*?(ugly).*?^# cat C$
Php демо