Ваше регулярное выражение введено в заблуждение.
Первое: [^...]
- это дополненный класс символов.Дополненный класс символов - это атом, и все, что является ...
, является набором символов, которые на данном этапе должны быть разрешены , а не .То есть, [^ab]
разрешит все, кроме a
и b
.
Второе: вы, кажется, хотите иметь возможность захватывать между паренами.Но парен (открытый или закрытый) - это специальный символ в регулярном выражении.Таким образом, в вашем примере, если $startString
равно  (
, пара будет интерпретироваться как метасимвол регулярного выражения.
Третье: к сожалению, это не может быть решено с помощью регулярных выражений, но вложенные $startString
и $endString
не может быть сопоставлено (ну, они могут быть с perl, но perl это perl).
Самое близкое, что вы можете получить к тому, что вы действительно хотите, это переписать свое регулярное выражение для использования с preg_match_all
следующим образом:
$start = preg_quote($startString, '/');
$end = preg_quote($endString, '/');
$re = '/\Q' . $start . '\E' # literal $start
. '(' # capture...
. '(?:(?!\Q' . $end . '\E).)' # any character, as long as $end is not found at this position,
. '+)' # one or more times
. '\Q' . $end . '\E/'; # literal $end
, а затем используйте это в качестве первого аргумента для preg_match_all
.
Модификаторы регулярных выражений \Q
и \E
говорят, что все, что находится между первым и вторым, должно рассматриваться как литералы -следовательно, слово «ребенок» в  (
будет трактоваться буквально, а не как метасимвол открытия группы.