Ваш "/\[[^\]]*\]/"
соответствует только подстрокам, например [.[.[..]
.
Вы можете легко получить значение, используя
(?|\['([^][]*)']|'([^'\\]*(?:\\.[^'\\]*)*)')
См regex demo, ваши ценности будут находиться в группе 1.
PHP demo:
$re = "/(?|\\['([^][]*)']|'([^'\\\\]*(?:\\\\.[^'\\\\])*)')/";
$str = "\$_['text_1'] = 'text_2 %d to %d of %d (%d text)';";
preg_match_all($re, $str, $matches);
print_r($matches[1]);
Регулярное выражение содержит 2 вариант с 2 захватом группы с индексом 1, так как используется группа сброса сброса (?|..|..)
. В 2 альтернативы совпадает:
\['([^][]*)']
- буквальный ['
, а затем с 0 или более чем ]
и [
символов до ']
'([^'\\]*(?:\\.[^'\\]*)*)')
- любая подстрока внутри одиночных кавычек, которые могут содержать любые ушедшие последовательности.
Или безопаснее один, который также позволит любому [
или ]
внутри первой группы (то есть, если у вас есть $_['P[O]ST']
, хотя я предполагаю, что это маловероятно):
(?|\['([^']*(?:'(?!])[^']*)*)'\]|'([^'\\]*(?:\\.[^'\\]*)*)')
См another demo
ваш пример имеет круглую скобку вместо квадратных скобок, которая может объяснить, почему она не работает по назначению. – Calimero
Где запятые? – Mariano
Почему бы просто не использовать '' ([^ '] +)' '[как это] (https://regex101.com/r/xZ2rO6/1), если ваши« запятые »всегда граничат с скобками и нет экранированных '' 'в строке. –