我想说我想把这个字符串分成两个变量:
$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匹配现在里面还有一个数字......
你会怎么做?
答案 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));