Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Разбиение строки с несколькими разделителями


Автор: TNT86 8.10.2007, 16:29
Есть строка и несколько типов разделителей пробел, запятая и так далее...

При использовании split и explode выходит какая-то лажа, то есть мягко говоря строка не разбивается.

Делаю что-то типа  $array=split(" !,",$string);

Есть какое решение этой проблемы?

Автор: webevt 8.10.2007, 16:50
Код

$str = preg_split ( "/(!|,)/s", $text );

$str - массив

Автор: TNT86 8.10.2007, 16:54
/s подразумевает пробел?

Добавлено через 5 минут и 44 секунды
Что-то все-равно так как нужно не работает :(

<?php
$string="hi mr agent!smith";

$result=preg_split("/(!|,)/s",$string);

foreach($result as $value)
{
   echo $value,'<BR><BR>';
};

?>

выдает 
hi mr agent

smith

а хотелось бы

hi

mr

ну и так далее, чтобы пробелы были тоже разделителями

Автор: chin 8.10.2007, 17:06
Код

preg_split ( "/(\s+|!|,)/", $text );

Автор: sTa1kEr 8.10.2007, 17:07
Цитата(TNT86 @  8.10.2007,  16:54 Найти цитируемый пост)
/s подразумевает пробел?

Нет. Это модификатор, означающий, что под набор символов "." будут так же попадать и переносы строк. 

Цитата(TNT86 @  8.10.2007,  16:54 Найти цитируемый пост)
Что-то все-равно так как нужно не работает :(

Код

$array = preg_split("/[!,\s]/", $string);

Автор: TNT86 8.10.2007, 17:27
Спасибо Всем, особенно to Chin - его код работает!


Только можешь объяснить почему он переносит пробелы?

Автор: sTa1kEr 8.10.2007, 17:55
Цитата(TNT86 @  8.10.2007,  17:27 Найти цитируемый пост)
Только можешь объяснить почему он переносит пробелы?

http://us2.php.net/manual/ru/reference.pcre.pattern.syntax.php
Цитата

\s - любой пробельный символ 

Автор: chin 8.10.2007, 20:58
TNT86,
Возьмите код sTa1kEr, у него правильнее.

Автор: CyClon 9.10.2007, 07:06
Код
<?php

$input = 'Word1, word2 word3 | word4 !word5     ,       word6|word7,word8    ,word9';

$result = preg_split('~[|!,\s]+~', $input);

print_r($result);

?>

Цитата
Array
(
    [0] => Word1
    [1] => word2
    [2] => word3
    [3] => word4
    [4] => word5
    [5] => word6
    [6] => word7
    [7] => word8
    [8] => word9
)


"|", "!", ",", "\s" - разделители. Можно убирать добавлять. "+" - значит, что разделители могут идти друг за другом (например запятая, а за ним пробел).

\s - любой пробельный символ (пробел, табуляция, перенос строки и т.д.)

Добавлено через 5 минут и 10 секунд
Можно еще так (Все зависит от задачи © MalHack):

Код
<?php

$input = 'Word1, word2 word3 | word4 !word5     ,       word6|word7,word8    ,word9';

$result = preg_split('~[^а-яА-Яa-zA-Z0-9]+~', $input);

print_r($result);

?>

Цитата
Array
(
    [0] => Word1
    [1] => word2
    [2] => word3
    [3] => word4
    [4] => word5
    [5] => word6
    [6] => word7
    [7] => word8
    [8] => word9
)


Разделителем будет считаться любой символ, кроме букв русского и английского алфавитов (верхний и нижний регистр), а так же цифр. То есть, имхо, самый оптимальный вариант разбить нужный текст на слова. В маске просто описываем символы, из которых может состоять слово (В данном случае а-я А-Я a-z A-Z 0-9).

Автор: TNT86 9.10.2007, 20:07
Спасибо Всем! Вопрос исчерпан!

Автор: 119040 10.10.2007, 21:50
CyClon, спасибо, мне тоже пригодилось!
Но как в списко исключений добавить пробел? Пробел в моем случае - не символ разделения!

Добавлено через 4 минуты и 39 секунд
Сорри, поспешил
Код

<?php

$input = 'Word1, word2 word3 | word4 !word5     ,       word6|word7,word8    ,word9';

$result = preg_split('~[|!]+~', $input);

print_r($result);

?>

Вопрос решен!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)