Как я могу разбить строку на пробелы в PHP, соблюдая подстроки? - PullRequest
2 голосов
/ 10 ноября 2011

Как я могу разбить строку на пробелы в PHP, соблюдая подстроки в кавычках?Я думаю, что должна быть какая-то команда для разбора этого типа строки как аргументы, но я не знаю, что это такое.

Пример строки:

$string = '12345 abcd "hello world" defgh "nice to meet you" 34554';

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

$result = str_replace(' ',"\n",$string);
$result = explode(' ',$string);
$result = preg_replace('#\s#',"\n",$string);

Результат:

12345
abcd
"hello
world"
defgh
"nice
to
meet
you"
34554

Желаемый результат:

12345
abcd
hello world
defgh
nice to meet you
34554

ОБНОВЛЕНИЕ

Полагаю, на меня произвела впечатление команда PHP parse_str для работы с переменными URL-запроса, и я надеялся, что в PHP есть что-то, что я мог бы использовать для этого примера, вроде какgetopt делает для аргументов командной строки.

Ответы [ 4 ]

6 голосов
/ 10 ноября 2011

Для этого вы можете использовать fgetcsv () / str_getcsv () .

<?php
$string = '12345 abcd "hello world" defgh "nice to meet you" 34554';
$row = str_getcsv($string, ' ');
var_dump($row);

печать

array(6) {
  [0]=>
  string(5) "12345"
  [1]=>
  string(4) "abcd"
  [2]=>
  string(11) "hello world"
  [3]=>
  string(5) "defgh"
  [4]=>
  string(16) "nice to meet you"
  [5]=>
  string(5) "34554"
}
2 голосов
/ 10 ноября 2011

Вот, пожалуйста:

$s = '12345 abcd "hello world" defgh "nice to meet you" 34554';
$m = preg_split('/"([^"]*)"|([^\s]+)/', $s, -1, PREG_SPLIT_DELIM_CAPTURE);
$m = array_values(array_filter(array_map('trim', $m)));
var_export($m);

Вывод:

array (
  0 => '12345',
  1 => 'abcd',
  2 => 'hello world',
  3 => 'defgh',
  4 => 'nice to meet you',
  5 => '34554',
)
2 голосов
/ 10 ноября 2011

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

Я позволю фактическому кодуВы, как упражнение, но по существу:

12345 abcd "hello world" defgh "nice to meet you" 34554

становится

12345 abcd
hello world
defgh
nice to meet you
34554

Тогда вы разбьетесь, используя пробелы, но только строки, которые не были заключены в кавычки (вот и всес четными индексами, если предположить, что первая ячейка проиндексирована с 0, что является четным):

12345 abcd           -> Split
hello world          -> Don't split
defgh                -> Split
nice to meet you     -> Don't split
34554                -> Split

, поэтому оно станет:

12345
abcd
hello world
defgh
nice to meet you
34554

Очевидно, что вы можете иметь "экранированные кавычки"Вам нужно будет как-то обдумать это - также оставьте читателю в качестве упражнения (это действительно легко).

1 голос
/ 10 ноября 2011

Это должно работать нормально:

function spaceExplode($var)
{
    $chunks = explode('"', $var);
    array_walk($chunks, function(&$text) {
        $text = trim($text);
    });

    $subchunks = array();
    foreach ($chunks as $key => $value) {
        if ($key % 2 != 0) {
            $subchunks[] = $value;
        } else {
            $subchunks = array_merge($subchunks, explode(' ', $value));
        }
    }

    return $subchunks;
}

Другим способом было бы использовать strtok (предложенный @ Romain в его ответе до того, как он его отредактировал:)):

function tokenize($var, $char)
{
    $tokens = array(strtok($var, $char));

    do {
        $tokens[] = strtok($char);
    } while(end($tokens) !== false);

    foreach ($tokens as $key => $token) {
        $tokens[$key] = trim($token);

        if (empty($tokens[$key])) {
            unset($tokens[$key]);
        }
    }

    return $tokens;
}
...