2010-07-16 19 views
8

Birisi hızlı ve kolay bir explode() işlevi gibi, bir çift keyfi karakter (örneğin, tırnak işareti) içine alınmış ayırıcı karakterleri göz ardı edebilecek bir işlev biliyor mu?Tırnak içinde karakterleri yok sayan bir explode() işlevi mi?

Örnek:

my_explode(
    "/", 
    "This is/a string/that should be/exploded.//But 'not/here',/and 'not/here'" 
); 

aşağıdaki üyeleri ile bir dizi yol açmalıdır:

This is 
a string 
that should be 
exploded. 

But 'not/here', 
and 'not/here' 

karakter olmaktan bölücülerin onları bağışlayacağını tek tırnak sarılı kalması. iki sarıcı karakterleri

(not/here) 

bir doğal PHP çözüm tercih edilmesi gerekir, ancak böyle bir şeyin varlığına sanmıyorum başa çıkabilirim bir çözüm

Bonus puan!

+0

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

cevap

6

str_getcsv($str, '/')

bağlantılı sayfada < 5.3 için bir reçete var. preg_split ile çok yakın

+0

+1, hemen hemen aynı şeyi göndermek üzereydi. –

+1

benim için çalışmıyor. muhafaza olarak '' 'tanımıyor. – Gordon

+0

Sonra farklı bir karakter bir muhafaza olarak geçirin. –

0

şey: http://fr2.php.net/manual/en/function.preg-split.php#92632

Birden sarıcı karakterleri VE çoklu sınırlayıcı karakterler işler. Eğer tırnak arasına da olmasak da sen dize ortasından söyleyemem çünkü

+0

Cheers @ greg0ire, bu iyi görünüyor ama yine de biraz işe ihtiyaç duyuyor. Regexes hakkındaki bilgi birikimim ile ihtiyaçlarımı değiştirmeye çalışacağım. –

4

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

+0

Kenar şeridi: Tırnaklar dengelenmemişse, bu işlev onları dengeli hale getirmek için yeteri kadar ayırır. – Brilliand

+0

'preg_quote' işlevini yeni öğrendim - bu, normal ifadelerde karakterlerden kaçmanın daha iyi bir yolu olabilir. – Brilliand

İlgili konular