Esto es casi imposible con preg_split
, porque no se puede decir desde el medio de la cadena si está entre comillas o no. Sin embargo, preg_match_all
puede hacer el trabajo.
solución simple para un solo tipo de cotización:
function quoted_explode($subject, $delimiter = ',', $quote = '\'') {
$regex = "(?:[^$delimiter$quote]|[$quote][^$quote]*[$quote])+";
preg_match_all('/'.str_replace('/', '\\/', $regex).'/', $subject, $matches);
return $matches[0];
}
Esa función tendrá todo tipo de problemas si se le pasa ciertos caracteres especiales (\^-], de acuerdo con http://www.regular-expressions.info/reference.html), por lo que necesito escapar de esos. Aquí hay una solución general que se escapa caracteres especiales de expresiones regulares y se puede realizar un seguimiento de varios tipos de cotizaciones por separado:
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];
}
(Tenga en cuenta que guardo todas las variables entre corchetes para minimizar lo que necesita escapar - fuera de los corchetes, hay aproximadamente el doble de caracteres especiales.)
Si desea utilizar] como una cita, entonces probablemente desee utilizar [como la cita correspondiente, pero voy a dejar de agregar esa funcionalidad como un ejercicio para el lector. :)
posible duplicado de [PHP explota la cadena, pero trata las palabras entre comillas como una sola palabra] (http://stackoverflow.com/questions/2202435/php-explode-the-string-but-treat-words -in-quotes-as-a-single-word) – Bergi