Ceci est presque impossible avec preg_split
, car vous ne pouvez pas dire à partir du milieu de la chaîne si vous êtes entre guillemets ou non. Cependant, preg_match_all
peut faire le travail.
solution simple pour un seul type de citation:
function quoted_explode($subject, $delimiter = ',', $quote = '\'') {
$regex = "(?:[^$delimiter$quote]|[$quote][^$quote]*[$quote])+";
preg_match_all('/'.str_replace('/', '\\/', $regex).'/', $subject, $matches);
return $matches[0];
}
Cette fonction aura toutes sortes de problèmes si vous le transmettre certains caractères spéciaux (\^-], selon http://www.regular-expressions.info/reference.html), de sorte que vous aurez besoin d'échapper à ceux-ci. Voici une solution générale qui échappe à des caractères spéciaux regex et peut suivre plusieurs types de citations séparément:
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];
}
(Notez que je garde toutes les variables entre crochets pour minimiser ce qui a besoin d'échapper - en dehors des crochets, il y a Si vous vouliez utiliser] comme une citation, alors vous vouliez probablement utiliser [comme la citation correspondante, mais je vais laisser ajouter cette fonctionnalité comme un exercice pour le lecteur. :)
duplication possible de [PHP exploser la chaîne, mais traiter les mots entre guillemets comme un seul mot] (http://stackoverflow.com/questions/2202435/php-explode-the-string-but-treat-words -in-quotes-as-a-single-word) – Bergi