Разбить строку по последнему пробелу

Опубликовано 2016.03.09

Допустим у нас есть строка
  1. $content = 'В CMS Drupal есть много типов материалов, которые можно расширить полями различных типов.';
И стоит задача разбить строку на две подстроки по последнему пробелу. Сразу напрашивается следующий код, но он не работает:
  1. $content = preg_split("/[\s]{1}/", $content);
По идее он должен разбить строку по первому пробелу, но разбивает он её по всем пробелам. Придётся пойти более сложным путём, а именно:
  1. //развернем строку задом наперед(реверс)
  2. //что бы корректно работали русские символы - создадим функцию mb_strrev:
  3. function mb_strrev($s) {
  4. $o = '';
  5. $c = 1;
  6. while(mb_strlen($o)<mb_strlen($s)) {
  7. $o .= mb_substr($s, -$c, 1);
  8. $c++;
  9. }
  10. return $o;
  11. }
  12.  
  13.  
  14. //делаем реверс строки
  15. $content = mb_strrev($content);
  16.  
  17. //делим строку по первому пробелу
  18. $content = preg_split("/[\s]{1}/", $content,PREG_SPLIT_DELIM_CAPTURE);
  19.  
  20. //делаем реверс строки для каждого элемента массива
  21. array_map('mb_strrev', $content);
  22.  
  23. //делаем реверс всего массива
  24. $content = array_reverse($content);
  25.  
  26. //PROFIT
Или одной строкой:
  1. $content = array_reverse(array_map('mb_strrev', preg_split("/[\s]{1}/", mb_strrev($content), PREG_SPLIT_DELIM_CAPTURE)));
  2.  
  3. function mb_strrev($s) {
  4. $o = '';
  5. $c = 1;
  6. while(mb_strlen($o)<mb_strlen($s)) {
  7. $o .= mb_substr($s, -$c, 1);
  8. $c++;
  9. }
  10. return $o;
  11. }
А теперь более изящное решение:)
  1. $content = 'В CMS Drupal есть много типов материалов, которые можно расширить полями различных типов.';
  2. preg_match('/([\w*\W]*)\s(.*)$/', $content, $m);
  3. unset($m[0]);
  4. $m = array_values($m);
  5. print_r($m);