У меня есть список:
$bad_words = ['aaa', 'bbb', 'ccc']
$good_words= ['__aaa', 'bbb==', '#ccc==']
По этим спискам я бы сгенерировал эти правила:
$rules = ['/((?<!__)aaa)/', '/(bbb(?!==))/', '/((?<!#)ccc(?!==))/']
Проблема: неверное ccc-правило (https://regex101.com/r/cC3hY7/1): он должен найти такие строки, как #ccc
, #ccc--
или же ccc==
и исключить только такие строки, как #ccc==
Как это исправить?
Вы могли бы просто использовать (*SKIP)(*F)
как ниже.
(?:#ccc==|bbb==|__aaa)(*SKIP)(*F)|(?:aaa|bbb|ccc)
# |<- Strings you don't want ----->|<--strings you want-->
Других решений пока нет …