Результирующее регулярное выражение будет очень сложным, особенно если у вас есть много исключений, таких как 'foo-bar'.
Вы должны использовать условный подшаблон с условием lookbehind в качестве условия и lookahead в качестве его шаблона yes.:
$res = preg_split('/(?(?<=foo)\-(?!bar)|\-)/', 'aasdf-fafsdf-foo-bar-asdf' );
var_dump( $res );
результат:
array(4) {
[0]=>
string(5) "aasdf"
[1]=>
string(6) "fafsdf"
[2]=>
string(7) "foo-bar"
[3]=>
string(4) "asdf"
}
Позвольте мне объяснить, что здесь происходит.\-
означает
Соответствует любому символу тире.
, но нам нужно:
Соответствует любому символу тире, который не является частьюfoo-bar.
Так как мы не можем реализовать это в регулярном выражении как есть, мы его немного изменим:
Соответствует любому символу тире, который if , перед которым стоит foo, не следует за баром.
Для реализации части , если , мы используем условный подшаблон, это синтаксис:
(?(condition)yes-pattern|no-pattern)
Наше «условие» будет «предшествовать foo», чтобы проверить, что мы используем lookbehind:
(?<=foo)
Если это правда, мы должны искать «черту, за которой не следует строка», чтобы сделатьчто мы используем негативный взгляд:
\-(?!bar)
И это становится нашим "образцом да".Наш «не шаблон» должен быть \-
или «любой тире».Полное регулярное выражение будет:
(?(?<=foo)\-(?!bar)|\-)
ОБНОВЛЕНИЕ: чтобы включить это в ваше текущее регулярное выражение, измените эту часть в конце:
|\ - |\ - |\- |\-|\ -/
на
|\s?(?(?<=foo)\-(?!bar)|\-)\s?/