Преобразуйте сложную строку в массив в php - PullRequest
1 голос
/ 18 декабря 2009

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

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

Вот исчерпывающий пример (с намеренно запутанным вводом):

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

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

Ответы [ 4 ]

10 голосов
/ 18 декабря 2009

Вы можете начать с , разбив строку на "полезные" части, с 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);

(Здесь регулярное выражение будет разделено на ',', ';' и '\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)

Что лучше; -)

1 голос
/ 18 декабря 2009

Split, а затем grep, похоже, дает ожидаемый результат:

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

РЕДАКТИРОВАТЬ: на самом деле grep не требуется:

$array = preg_split('/\s*[;,\n]\s*/', $string, -1, PREG_SPLIT_NO_EMPTY);
$string = implode(',', $array);
1 голос
/ 18 декабря 2009

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

В идеале, это допускает больше беспорядочных символов, чем просто; \ s \ n и т. Д.

$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 голос
/ 18 декабря 2009

Вы можете использовать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...