2016-03-08 46 views
2

一個單一的數字比方說,我想這個字符串中的兩個變量分爲:分割字符串,但接受的文本里面

$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位數之間。 但是$文本匹配現在有一個數字在裏面...

你會怎麼做呢?

+1

http://stackoverflow.com/questions/1450967/match-number-at-the-end-of-the-string:['^ * \ B(\ d +)$'](https://regex101.com/r/cR9rL8/1) –

+0

'/(.+?)+(\ d +)$ /' – fusion3k

+0

@WiktorStribiżew好的,但你如何匹配「levis 5° 「? – Chriz74

回答

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+字符,而不是數字,後面是字符串結尾。

(?=...)構造是一個積極的向前看,它不消耗字符,只是檢查裏面的模式是否匹配,如果是,返回「true」,如果不是,則不匹配。

參見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)); 
+0

這個是爲我工作的''/ ^(。*?)\\ s *(\\ d +)$ /「'。你能不能指點我一個教程或模式上的東西? – Chriz74

+0

我不知道你的正則表達式知識的水平:)所以我只能建議在[regexone.com](http://regexone.com/)上做所有的課,閱讀[regular-expressions.info](http: //www.regular-expressions.info),[正則表達式SO標籤描述](http://stackoverflow.com/tags/regex/info)(有許多其他鏈接到偉大的在線資源),社區SO帖子稱爲[什麼是正則表達式](http://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean)。 –

+0

我已經添加了解釋。 –