Bu, preg_split
ile yakın imkansızdır. Ancak, preg_match_all
işini yapabilir.
alıntı tek tip
Basit çözüm: Eğer belirli özel karakterler geçerse
function quoted_explode($subject, $delimiter = ',', $quote = '\'') {
$regex = "(?:[^$delimiter$quote]|[$quote][^$quote]*[$quote])+";
preg_match_all('/'.str_replace('/', '\\/', $regex).'/', $subject, $matches);
return $matches[0];
}
Bu işlev sorunlarının her türlü olacaktır (\^-] http://www.regular-expressions.info/reference.html göre) sahipse olacak böylece Onlardan kaçmaya ihtiyacım var. - vardır köşeli parantez dışında
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];
}
(ı kaçan neye ihtiyacı en aza indirmek için köşeli parantez değişkenlerin tüm tutmak unutmayın: Burada özel regex karakterleri kaçar ve ayrı ayrı tırnak çoklu türlerini de izleyebilirsiniz genel çözüm yaklaşık iki kat fazla özel karakter.)
Eğer bir alıntı olarak kullanmak isterseniz, o zaman muhtemelen [karşılık gelen alıntı olarak kullanmak istediniz, ancak bu işlevselliği okuyucuya bir alıştırma olarak eklemeyi bırakacağım. :) ait
olası yinelenen http://stackoverflow.com/questions/2202435/php-explode-the-string-but-treat-words ([PHP dize patlayabilir, ancak tek bir kelime olarak tırnak içinde kelimeleri tedavi] -in-tırnak-bir-tek-kelime) – Bergi