Кто-нибудь знает быструю и легкую функцию 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
Он обрабатывает несколько символов оболочки и несколько символов разделителя.