使用preg_split在定界符前的最后一个空格处拆分字符串?

时间:2019-01-17 11:14:16

标签: php regex preg-split

我正在尝试使用preg_split在斜杠前的每个空格处分割以下字符串。我知道这将是一个简单的REGEX,但是我似乎无法使用RegExr弄清楚它?

$string = 'DZ9243/XSHAGT FFGD JERSE XS2 DZ9232/MHAGT SUUMTE KNI M10 DZ9232/LHAGT SUMMER KNI L6';

我需要在每个/之前的最后一个空格处分割字符串,以得到以下结果:

DZ9243/XSHAGT FFGD JERSE XS2 
DZ9232/MHAGT SUUMTE KNI M10
DZ9232/LHAGT SUMMER KNI L6

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

如果它不是没有正则表达式...

$string = 'DZ9243/XSHAGT FFGD JERSE XS2 DZ9232/MHAGT SUUMTE KNI M10 DZ9232/LHAGT SUMMER KNI L6';

$parts = explode(' ', $string);
$results = [];
$i = -1;

foreach($parts as $part) {
  strpos($part, '/') !== false ? $results[++$i] = $part : $results[$i] .= ' ' . $part;
}

var_dump($results);

答案 1 :(得分:0)

您可以使用前瞻性断言:

$string = 'DZ9243/XSHAGT FFGD JERSE XS2 DZ9232/MHAGT SUUMTE KNI M10 DZ9232/LHAGT SUMMER KNI L6';
$pieces = preg_split('@ (?=[^ ]*/)@', $string);

print_r($pieces);

输出为:

Array
(
    [0] => DZ9243/XSHAGT FFGD JERSE XS2
    [1] => DZ9232/MHAGT SUUMTE KNI M10
    [2] => DZ9232/LHAGT SUMMER KNI L6
)

正则表达式

@ (?=[^ ]*/)@
  • @regex delimiter;通常将/用作定界符,但是此正则表达式会尝试匹配/,这就是为什么最好使用其他定界符的原因;
  • 后跟一个空格字符;这是您要用作分隔输入字符串的定界符的空间;
  • (开始一个小组;该断言需要该组;
  • ?=是前瞻性肯定声明;它要求该组匹配输入字符串,但不消耗与该组匹配的输入字符串中的字符;
  • [^ ]*/是组内容;它多次匹配任何非空格字符,后跟/;这是包含斜杠(/)的单词;
  • )结束群组。

总而言之,regex匹配空格,其后跟包含斜杠的单词,但该单词不被使用; preg_split()不包含在定界符中,只使用空格字符。