разделить на несколько символов и включить их в части - PullRequest
2 голосов
/ 30 апреля 2011

Я хочу разбить строку на несколько символов (будучи +, ~, > и @, но я хочу, чтобы эти символы были частью возвращаемых частей.

Я пытался:

$parts = preg_split('/\+|>|~|@/', $input, PREG_SPLIT_DELIM_CAPTURE);

В результате получаются только 2 части, где должно быть 5, а split-char не является частью части [1].

Я тоже пробовал:

$parts = preg_split('/\+|>|~|@/', $input, PREG_SPLIT_OFFSET_CAPTURE);

В результате получается, что 1 часть слишком мала (4 вместо 5), а последняя часть содержит символ разделения.

Без флагов в preg_split результат почти идеален (столько частей, сколько должно быть), но все разделенные символы пропали.

Пример: * ** 1022 тысячу двадцать одна * $input = 'oele>boele@4 + key:type:id + *~the end'; // spaces should be ignored $output /* should be: */ array( 'oele', '>boele', ' @4 ', '+ key:type:id ', '+ *', '~the end' ); Есть ли функция spl или флаг, чтобы сделать это, или я должен сделать один сам = (

Ответы [ 4 ]

6 голосов
/ 30 апреля 2011
$parts = preg_split('/(?=[+>~@])/', $input);

Смотрите это

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

(?=     : Start of positive lookahead
 [+>~@] : character class to match any of your delimiters.
)       : End of look ahead assertion.

Фактически вы просите preg_split разбить входную строку в точках непосредственно перед разделителями.

6 голосов
/ 30 апреля 2011

Вам не хватает назначения для параметра limit, поэтому он возвращает меньше, чем вы ожидали, попробуйте:

$parts = preg_split('/\+|>|~|@/', $input, -1, PREG_SPLIT_OFFSET_CAPTURE);
0 голосов
/ 30 апреля 2011

Бен прав.

Просто добавьте к его ответу, PREG_SPLIT_DELIM_CAPTURE - это константа со значением 2, поэтому вы получите 2 разделения, аналогично PREG_SPLIT_OFFSET_CAPTURE имеет значение 4.

0 голосов
/ 30 апреля 2011

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

$parts = preg_split('/(\+|>|~|@)/', $input, PREG_SPLIT_OFFSET_CAPTURE);

, и вот как оно объяснено: http://www.php.net/manual/en/function.preg-split.php#94238

...