2009-12-18 5 views
1

У меня есть переменная php, которая исходит из формы, требующей уборки. Я надеюсь, что вы можете помочь.Преобразование сложной строки в массив в php

Переменная содержит список элементов (возможно, два или три слова с пробелом между словами). Я хочу преобразовать его в список, разделенный запятой, без лишнего пробела. Я хочу, чтобы дивизии падали только запятыми, полуколониями или новыми линиями. Пустота не может быть элементом.

Вот всеобъемлющий пример (с нарочито грязный вход):

Variable In: "dog, cat   ,car,tea pot,, ,,, ;;(++NEW LINE++)fly,  cake" 
Variable Out "dog,cat,car,tea pot,fly,cake" 

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

ответ

10

Вы можете начать расщепления строки на "полезные" части, с preg_split, и, затем, implode эти части вместе:

$str_in = "dog, cat   ,car,tea pot,, ,,, ;; 
fly,  cake"; 

$parts = preg_split('/[,;\s]/', $str_in, -1, PREG_SPLIT_NO_EMPTY); 

$str_out = implode(',', $parts); 

var_dump($parts, $str_out); 

(Здесь, регулярное выражение будет split на ',', ';' и '\s', что означает любой символ пробела - и мы сохраняем непустые детали)

Получит вас, для $parts:

array 
    0 => string 'dog' (length=3) 
    1 => string 'cat' (length=3) 
    2 => string 'car' (length=3) 
    3 => string 'tea' (length=3) 
    4 => string 'pot' (length=3) 
    5 => string 'fly' (length=3) 
    6 => string 'cake' (length=4) 

И для $str_out:

string 'dog,cat,car,tea,pot,fly,cake' (length=28) 



Редактировать после комментария: жаль, что я не сделал обратите внимание, что один ^^

В этом случае, вы не можете разделить на белом пространстве :-(я бы, вероятно, расщепляется «,» или «;», перебирайте частей, используя trim удалить уайт-символы в начале и конец каждого элемента, и только сохранить те, которые не являются пустыми:

$useful_parts = array(); 
$parts = preg_split('/[,;]/', $str_in, -1, PREG_SPLIT_NO_EMPTY); 
foreach ($parts as $part) { 
    $part = trim($part); 
    if (!empty($part)) { 
     $useful_parts[] = $part; 
    } 
} 
var_dump($useful_parts); 


Выполнение этой части кода получает меня:

array 
    0 => string 'dog' (length=3) 
    1 => string 'cat' (length=3) 
    2 => string 'car' (length=3) 
    3 => string 'tea pot' (length=7) 
    4 => string 'fly' (length=3) 
    5 => string 'cake' (length=4) 


И взрывается все вместе, я получаю, на этот раз:

string 'dog,cat,car,tea pot,fly,cake' (length=28) 

Что лучше ;-)

+0

Это отличный ответ. Как бы вы сохранили «чайный горшок» как один предмет в конечном списке? –

+0

@Patrick: Я отредактировал свой ответ со второй мыслью - не совсем заметил этот случай ^^ –

+0

Это прекрасно работает. Чем ты, очень. –

1

Вы можете использовать explode и trim и str_replace, чтобы получить массив вручную удалить отдельные символы, а затем верните его в массив.

function getCleanerStringFromString($stringIn) { 
    ///turn the string into an array with a comma as the delimiter 
    $myarray = explode(",",$stringin); 

    for ($ii =0; $ii < count($myarray); $ii++) { 
     ///remove new lines, semi colons, etc 
     ///use this line as many times as you'd like to take out characters 
     $myarray($ii) = str_replace(";","",$myarray($ii); 


     ////remove white spaces 
     $myarray($ii) = trim($myarray($ii)); 

    } 

    //then turn it back into an array: 
    $backstring = implode(","$myarray); 

    return $backstring; 
} 
1

Разнесение всей строки на запятой, пройти через этот массив, сначала соответствие всех символов, которые не-Za-z0-9 (и пространство), а затем остальные обрезки/заднее пространство. Если пустой, отмените элемент из массива. Верните строку в строку.

В идеале, это позволяет более запутанных символов, чем просто,; \ S \ п и т.д.

$strIn = "dog, cat   ,car,tea pot,, ,,, ;;(++NEW LINE++)fly,  cake"; 
$firstArray = explode(",", $strIn); 

$searchPattern = "/[^A-Za-z0-9 ]+/"; 

function removeViolators($item, $key) { 
    preg_replace($searchPattern, "", $item); 
    trim($item); 
    if (empty($item)) { 
     unset($item); 
    } 
} 

array_walk($firstArray, removeViolators); 
$strOut = implode(",", $firstArray); 
1

Split затем Grep, кажется, дает ожидаемый результат:

$array = preg_split('/\s*[;,\n]\s*/', $string); 
$array = preg_grep('/^\s*$/', $array, PREG_GREP_INVERT); 
$string = implode(',', $array); 

EDIT: на самом деле grep не требуется:

$array = preg_split('/\s*[;,\n]\s*/', $string, -1, PREG_SPLIT_NO_EMPTY); 
$string = implode(',', $array); 
Смежные вопросы