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*$)/
достаточно зависит от необходимости.