Это своего рода выход из ада. Несмотря на то, что уже есть принятый ответ, оригинальная модель на самом деле лучше. Зачем? Это позволяет избежать экранирующего символа, используя
Метод развёртывания цикла, описанный Джеффри Фридлом в «Мастеринге регулярных выражений»: "([^\\"]*(?:\\.[^\\"]*)*)"
(адаптировано для одинарных кавычек)
Демо
Развертывание цикла (с использованием двойных кавычек)
" # the start delimiter
([^\\"]* # anything but the end of the string or the escape char
(?:\\. # the escape char preceeding an escaped char (any char)
[^\\"]* # anything but the end of the string or the escape char
)*) # repeat
" # the end delimiter
Это не решает проблемы выхода из ада, но вы также были здесь:
Пример кода :
$re = '/\'([^\\\\\']*(?:\\\\.[^\\\\\']*)*)\'/';
$str = '\'foo\', \'can\\\'t\', \'bar\'
\'foo\', \' \\\'cannott\\\'\\\\\', \'bar\'
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);