Интеллектуальное разделение строки на массив

Этот код разделит строку на массив, содержащий тест и строку:

$str = 'test string';
$arr = preg_split('/\s+/', $str);

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

$str = 'test "Two words"';

Это также должно вернуть массив с двумя элементами, test и Two words.

И еще форма, если можно:

$str = 'test=Two Words';

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

Итак, как я могу сделать это с помощью preg_split?


person Alex    schedule 05.12.2012    source источник


Ответы (2)


Попробуйте str_getcsv:

print_r(str_getcsv('test string'," "));
print_r(str_getcsv('test "Two words"'," "));
print_r(str_getcsv('test=Two Words',"="));

Выходы

Array
(
    [0] => test
    [1] => string
)
Array
(
    [0] => test
    [1] => Two words
)
Array
(
    [0] => test
    [1] => Two Words
)

Вы можете использовать что-то вроде preg_match, чтобы проверить, существует ли знак равенства перед пробелом, а затем определить, какой разделитель использовать.

Однако работает только в PHP >= 5.3.

person Passerby    schedule 05.12.2012

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

Имея строку 'I am a string "with an embedded" string', вы можете сначала разделить ее на кавычки, что даст вам ['I am a string', 'with an embedded', 'string'], затем вы перейдете ко всем остальным элементам массива и разделите их на пробелы, в результате чего получится ['I', 'am', 'a', 'string', 'with an embedded', 'string'].

Точный код для этого вы, вероятно, можете написать сами. Если нет, дайте мне знать, и я помогу вам.

В вашем последнем примере просто разделите символ равенства:

$str = 'test=Two Words';
print explode('=', $str);
person Hubro    schedule 05.12.2012