在数字和文本中拆分字符串,但接受内部有一位数字的文本

时间:2016-03-08 17:38:41

标签: php regex string split preg-match

我想说我想把这个字符串分成两个变量:

$string = "levis 501";

我会用

preg_match('/\d+/', $string, $num);
preg_match('/\D+/', $string, $text);

然后让我们说我想把这个分成两个

$string = "levis 5° 501";

$text = "levis 5°";$num = "501";

所以我猜我应该在preg_match('/\d+/', $string, $num);添加一个规则,只在字符串的END处查找数字,我希望它在2到3位之间。 但是$ text匹配现在里面还有一个数字......

你会怎么做?

1 个答案:

答案 0 :(得分:2)

要将字符串分成两部分,请使用以下任意一项:

preg_match('~^(.*?)\s*(\d+)\D*$~s', $s, $matches);

此正则表达式匹配:

  • ^ - 字符串的开头
  • (.*?) - 第1组捕获任意一个或多个字符,尽可能少(因为*?是一个"懒惰"量词),直到......
  • \s* - 零个或多个空白符号
  • (\d+) - 第2组捕获1个或多个数字
  • \D* - 除数字以外的零个或多个字符(与\d相反的速记字符类)
  • $ - 字符串结束。

~s修饰符是一个DOTALL,它强制.匹配任何字符,即使是换行符,如果没有此修饰符,它也不匹配。

preg_split('~\s*(?=\s*\d+\D*$)~', $s);

\s*(?=\s*\d+\D*$)模式:

  • \s* - 零个或多个空格,但仅在后面跟着......
  • (?=\s*\d+\D*$) - 零个或多个空格后跟1+个数字后跟0个字符,而不是数字后跟字符串结尾。

(?=...)构造是一个积极的前瞻,它不消耗字符,只是检查里面的模式是否匹配,如果是,则返回&#34; true&#34;,如果不是,则不会发生匹配。< / p>

请参阅IDEONE demo

$s = "levis 5° 501";
preg_match('~^(.*?)\s*(\d+)\D*$~s', $s, $matches);
print_r($matches[1] . ": ". $matches[2]. PHP_EOL);
print_r(preg_split('~\s*(?=\s*\d+\D*$)~', $s, 2));