Функция explode (), которая игнорирует символы внутри кавычек?

Кто-нибудь знает быструю и легкую функцию explode() которая может игнорировать символы разделителя, заключенные в пару произвольных символов (например, котировки)?

Пример:

 my_explode( "/", "This is/a string/that should be/exploded.//But 'not/here',/and 'not/here'" ); 

должен привести к массиву со следующими членами:

 This is a string that should be exploded. But 'not/here', and 'not/here' 

тот факт, что символы обернуты в одинарные кавычки, избавит их от сплиттеров.

Бонусные баллы за решение, которое может обрабатывать два символа-обертки

 (not/here) 

Предпочиталось бы собственное PHP-решение, но я не думаю, что такая вещь существует!

str_getcsv ($str, '/')

Существует рецепт для <5.3 на связанной странице.

Это почти невозможно с preg_split , потому что вы не можете сказать из середины строки, находитесь ли вы между кавычками или нет. Однако preg_match_all может выполнить эту работу.

Простое решение для одного типа цитат:

 function quoted_explode($subject, $delimiter = ',', $quote = '\'') { $regex = "(?:[^$delimiter$quote]|[$quote][^$quote]*[$quote])+"; preg_match_all('/'.str_replace('/', '\\/', $regex).'/', $subject, $matches); return $matches[0]; } 

Эта функция будет иметь всевозможные проблемы, если вы передадите ей определенные специальные символы (\ ^ -], в соответствии с http://www.regular-expressions.info/reference.html ), поэтому вам нужно будет их избежать. Вот общее решение, которое ускользает от специальных символов регулярных выражений и может отслеживать несколько видов котировок отдельно:

 function regex_escape($subject) { return str_replace(array('\\', '^', '-', ']'), array('\\\\', '\\^', '\\-', '\\]'), $subject); } function quoted_explode($subject, $delimiters = ',', $quotes = '\'') { $clauses[] = '[^'.regex_escape($delimiters.$quotes).']'; foreach(str_split($quotes) as $quote) { $quote = regex_escape($quote); $clauses[] = "[$quote][^$quote]*[$quote]"; } $regex = '(?:'.implode('|', $clauses).')+'; preg_match_all('/'.str_replace('/', '\\/', $regex).'/', $subject, $matches); return $matches[0]; } 

(Обратите внимание, что я сохраняю все переменные между квадратными скобками, чтобы свести к минимуму то, что нужно ускользнуть – вне квадратных скобок есть примерно вдвое больше специальных символов.)

Если бы вы хотели использовать] в качестве цитаты, то вы, вероятно, хотели использовать [в качестве соответствующей цитаты, но я оставлю эту функциональность как упражнение для читателя. 🙂

Что-то очень близко к preg_split: http://fr2.php.net/manual/en/function.preg-split.php#92632

Он обрабатывает несколько символов оболочки и несколько символов разделителя.