2013-04-10 3 views
0

У меня есть строка, которая выглядит следующим образом:Как разбить эту строку на PHP?

'word','another word','and a sentence','and more','etc etc' 

Мне нужно разделить это на две строки, разделенные второй запятой, который не должен показывать ни в одном из предложений. Что усложняет ситуацию, так это то, что здесь также могут быть запятые внутри различных частей цитаты строки.

Может ли кто-нибудь мне помочь?

+3

Sharing ваше исследование помогает всем. Расскажите, что вы пробовали и почему это не соответствовало вашим потребностям. Это демонстрирует, что вы потратили время, чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов и, прежде всего, помогает вам получить более конкретный и релевантный ответ! –

+0

- это полный массив или строка? –

+0

@Phil Вам нужно будет дважды проверить свой принятый ответ. – deceze

ответ

0
$a="'word','another word','and a sentence','and more','etc etc'"; 

//preg_match('{(.*?,[^,]*),(.*)}', $a, $matches); 
preg_match('{(.*?[^\\\\]\',.*?[^\\\\]\'),(.*)}', $a, $matches); //UPDATE 
print_r($matches); 

DISPLAY:

Array 
(
    [0] => 'word','another word','and a sentence','and more','etc etc' 
    [1] => 'word','another word' 
    [2] => 'and a sentence','and more','etc etc' 
) 
+0

* "Что усложняет то, что здесь также могут быть запятые внутри различных частей цитаты строки." * - Это Решение выходит из строя, если в строке есть запятая. – deceze

+0

Да, если группа 1 или 2 hv запятая, она не работает, я отправляю другое решение ниже, используя eval ("\ $ arr = array ($ a);"); –

+0

UPDATE TO preg_match ('{(. *? [^ \\\\] \',. *? [^ \\\\] \ '), (. *)}', $ A, $ matches); , или \' –

1

Это очень выглядит как синтаксис CSV, так:

$parsed = str_getcsv($string, ',', "'"); 
$string1 = join(',', array_slice($parsed, 0, 2)); 
$string2 = join(',', array_slice($parsed, 2)); 

Если ваш PHP версии ниже 5.3 и, следовательно, вы не имеете str_getcsv, вы можете повторить это, используя виртуальный дескриптор файла для php://temp и fgetcsv ,

В качестве альтернативы, в зависимости от сложности вашего синтаксиса, strtok может использоваться для простого анализатора. Найдите первый ', затем следующий ', то ,, то ', то следующий ' и у вас есть первая часть строки ...

+0

deceze, есть ли способ сохранить цитаты вокруг различных частей строки? str_getcsv удаляет все. – Phil

+0

Тогда просто положите их обратно. 'array_map (function ($ str) {return" '$ str' ";}, $ parsed);' – deceze

0

Так вы говорите, что там могут быть запятые в кавычки .. так preg_split может помочь вам гораздо лучше, чем взорваться

 <?php 

       $string = "'word','another word','and a sentence','and more','etc etc'"; 
       $pattern = '%\',\'%'; 
       $split = preg_split($pattern,$string); 
       $array1 = array(); 
       $array2 = array(); 
       foreach($split as $key=>$value) 
       { 
        $value = trim($value,"'"); 
        $value = "'{$value}'"; 

        if(($key === 0) || ($key ===1)) 
        { 
         $array1[] = $value; 
        } 
        else 
        { 
         $array2[] = $value; 
        } 
       } 

       echo $req_string1 = implode(',',$array1); 
       echo "<br>"; 
       echo $req_string2 = implode(',',$array2);  


      ?> 
0

запятые между котировки

$a="'word','another word','and a sentence','and more','etc etc'"; 

eval("\$arr = array($a);"); 

$text1=''; 
$text2=''; 
foreach($arr AS $k=>$v){ 
    if($k<2){ 
     $text1.=$text1?',':''; 
     $text1.="'{$v}'"; 
    }else{ 
     $text2.=$text2?',':''; 
     $text2.="'{$v}'"; 
    } 
} 
echo $text1; 
echo PHP_EOL; 
echo $text2; 

'слово', 'другое слово'

'и предложение', 'и больше', 'и т.д. и т.п.'