Регулярное выражение для сопоставления запятой не между символами группировки - PullRequest
5 голосов
/ 26 мая 2011

Мне нужно регулярное выражение, которое будет соответствовать запятой, которая НЕ находится между '[' и ']' или '(' and ')' или '{' и '}'. Другие символы группировки не имеют значения. Я пытался понять это, но я не могу придумать ничего, что могло бы сделать это.

Регулярное выражение должно использоваться с функцией PHP preg_split для разделения строки на совпавшие запятые.

Пример строки, содержащей запятые и символы группировки:

<div>Hello<div>,@func[opt1,opt2],{,test},blahblah

Строка должна быть разбита следующим образом:

1: '<div>Hello<div>'
2: '@func[opt1,opt2]'
3: '{,test}'
4: 'blahblah'

И я только что подумал об этом, но на этом этапе все символы группировки гарантированно будут иметь совпадающие символы, если это помогает.

Любая помощь будет ОТЛИЧНО оценена =)

Ответы [ 2 ]

10 голосов
/ 26 мая 2011

На самом деле это не невозможно сделать это разделение.Рассмотрим этот код:

$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"
}
1 голос
/ 26 мая 2011

Не думаю, что это можно сделать регулярным выражением.Основная проблема заключается в том, что для этого требуются отрицательные отстранения переменной длины (запретить любые [({за которыми не следует a])}), а это не та возможность, которой обладает RE в настоящее время.

...