Regex для разделения строки только на последний символ пробела

надеюсь, что это должно быть быстрым и простым, используя 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 ) 

Благодарим вас за помощь!

Ответ 1

Try:

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

Edit

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

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

\S является лишь короткой рукой для класса символов [^\s]. Другими словами: он соответствует одному символу, отличному от символа пробела. + после * делает класс символов \S possessive.

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

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

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

Ответ 2

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

$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 );

Ответ 3

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