virgül ve boşlukla sıradanifade bölünmüş dize, ancak iç tırnak ve parantez görmezden

2 Cevap php

Ben virgül ve boşluk ile bölünmüş dize gerekiyor, ama içinde tırnak, tek tırnak ve parantez görmezden

$str = "Questions, \"Quote\",'single quote','comma,inside' (inside parentheses) space #specialchar";

Elde edilen dizi olacak, böylece

[0]Questions
[1]Quote
[2]single quote
[3]comma,inside
[4]inside parentheses
[5]space
[6]#specialchar

Benim atual sıradanifade olduğunu

$tags = preg_split("/[,\s]*[^\w\s]+[\s]*/", $str,0,PREG_SPLIT_NO_EMPTY);

ancak bu özel karakter görmezden ve hala tırnak içine virgül bölünür, çıkan dizidir:

[0]Questions
[1]Quote
[2]single quote
[3]comma
[4]inside
[5]inside parentheses
[6]space
[7]specialchar

ps: bu hiçbir csv'dir

Çok teşekkürler

2 Cevap

Bu, yalnızca olmayan iç içe parantez için çalışacak:

    $regex = <<<HERE
    /  "  ( (?:[^"\\\\]++|\\\\.)*+ ) \"
     | '  ( (?:[^'\\\\]++|\\\\.)*+ ) \'
     | \( ( [^)]*                  ) \)
     | [\s,]+
    /x
    HERE;

    $tags = preg_split($regex, $str, -1,
                         PREG_SPLIT_NO_EMPTY
                       | PREG_SPLIT_DELIM_CAPTURE);

++ ve *+ onlar kadar tüketmek ve yararlar için hiçbir şey geri verecektir. Bu teknik eşleştirme bu tür yapmak için en etkili yol olarak perlre(1) açıklanmıştır.

Peki, bu size verilen veriler için çalışır:

$rgx = <<<'EOT'
/
  [,\s]++
  (?=(?:(?:[^"]*+"){2})*+[^"]*+$)
  (?=(?:(?:[^']*+'){2})*+[^']*+$)
  (?=(?:[^()]*+\([^()]*+\))*+[^()]*+$)
/x
EOT;

Lookaheads herhangi bir çift-tırnak, tek tırnak ya da önlerinde bir hatta numara var geçerli maç pozisyonun parantez, ve Pars varsa (hiçbir yuvalama izin) dengeli çiftleri olduğunu iddia. Yani mevcut maç tırnak veya Pars bir çift içinde meydana olmadığından emin olmak için bir kirli hızlı-ve-yolu.

Tabii ki, bu giriş iyi biçimlendirilmiş varsayar. Ama tırnak içinde kaçan tırnak hakkında çok iyi biçimliliğin, konusunda? Ne Pars içinde tırnak, veya tersi varsa? Bu giriş yasal olurdu?

"not a \" quote", 'not a ) quote', (not ",' quotes)

Eğer öyleyse, önünüzde çok daha zor bir işi var.