Regex для разделения строки только последним пробельным символом - PullRequest
13 голосов
/ 07 октября 2009

надеюсь, это должно быть быстро и просто, используя PHP, я пытаюсь разбить строку на массив, но только последним экземпляром пробела. Пока у меня есть ...

$str="hello this is     a    space";
$arr=preg_split("/\s+/",$str);
print_r($arr);

Array ( [0] => hello [1] => this [2] => is [3] => a [4] => space ) 

... который разделяется на все пробелы.

Как я могу расширить это регулярное выражение, чтобы разделить его только на последний экземпляр пробела? Стать ...

Array ( [0] => hello this is     a [1] => space ) 

Заранее спасибо за помощь!

Ответы [ 3 ]

44 голосов
/ 07 октября 2009

Попробуйте:

$arr=preg_split("/\s+(?=\S*+$)/",$str);

Редактировать

Краткое объяснение:

(?= ... ) называется положительным взгляд в будущее . Например, a(?=b) будет соответствовать только одному 'a', если следующий символ (тот, что справа от него) - 'b'. Обратите внимание, что 'b' является , а не частью матча!

\S - это просто сокращение для класса символов [^\s]. Другими словами: он соответствует одному символу, кроме символа пробела. + после * делает класс персонажа \S притяжательным .

Наконец, $ обозначает конец строки.

Напомним, что полное регулярное выражение \s+(?=\S*+$) будет выглядеть на простом английском языке следующим образом:

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

2 голосов
/ 07 октября 2009

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

$str="hello this is a  space";

preg_match('~^(.*)\s+([^\s]+)$~', $str, $matches);
$result = array($matches[1], $matches[2]);

Вы можете сделать это без регулярного выражения:

$parts = array_map('trim', explode(' ', $str));
$result = array(
    implode(' ', array_slice($parts, 0, -1)),
    end($parts)
);

или

$lastSpace = strrpos($str, ' ');
$str1 = trim(substr($str, 0, $lastSpace));
$str2 = trim(substr($str, $lastSpace));
$result = array( $str1, $str2 );
0 голосов
/ 09 октября 2009

Если * и + после \S дублируются? Только /\s+(?=\S+$)/ или /\s+(?=\S*$)/ достаточно в зависимости от необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...