Мне нужно регулярное выражение, которое будет соответствовать запятой, которая НЕ находится между «[» и «]» или «(» и «)» или «{» и «}». Другие символы группировки не имеют значения. Я попытался понять это, но я не могу придумать ничего, что бы это сделало.
Регулярное выражение должно использоваться с функцией preg_split PHP для разделения строки на совпадающие запятые.
Примерная строка, содержащая запятые и группирующие символы:
<div>Hello<div>,@func[opt1,opt2],{,test},blahblah
Строка должна делиться следующим образом:
1: '<div>Hello<div>' 2: '@func[opt1,opt2]' 3: '{,test}' 4: 'blahblah'
И я просто подумал об этом, но в этот момент все символы группировки гарантированно имеют соответствующие символы, и это помогает.
Любая помощь была бы БОЛЬШОЙ appriciated =)
На самом деле это невозможно сделать. Рассмотрим этот код:
$str = '<div>Hello<div>,(foo,bar),@func[opt1,opt2],{,test},blahblah'; $arr = preg_split('~([^,]*(?:{[^}]*}|\([^)]*\)|\[[^]]*])[^,]*)+|,~', $str, -1 , PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); var_dump($arr);
array(5) { [0]=> string(15) "<div>Hello<div>" [1]=> string(9) "(foo,bar)" [2]=> string(16) "@func[opt1,opt2]" [3]=> string(7) "{,test}" [4]=> string(8) "blahblah" }
Я не думаю, что это можно сделать в регулярном выражении. Основная проблема заключается в том, что для этого требуется отрицательный внешний вид переменной длины (запретить любой [({, за которым не следует a))}), и это не возможность, которую RE имеет в настоящее время.