Это почти невозможно с 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];
}
(Обратите внимание, что я держу все переменные в квадратных скобках, чтобы минимизировать то, что нужно экранировать - за пределами квадратных скобок специальных символов примерно вдвое больше.)
Если вы хотите использовать] в качестве цитаты, то вы, вероятно, хотели бы использовать [в качестве соответствующей цитаты, но я оставлю добавление этой функции в качестве упражнения для читателя. :)