2010-07-30 30 views
0

我嘗試提取下面的字符串「INV」部分:PHP:需要使用的preg_match提取字符串的某些部分()

123_456_P1234_INV_UID-123456.PDF 

下面的代碼我到目前爲止:

php -r 'echo preg_match("/_(.*?)_UID-.*?\.PDF$/", "123_456_P1234_INV_UID-123456.PDF", $cat) ? $cat[1]."\n" : "";' 

這將返回:

_456_P1234_INV 

誰能告訴我爲什麼它包括INV位之前的一切嗎?我怎樣才能取得INV部分?

+0

是的,雖然它可能不總是「INV」,這就是爲什麼我使用這種方法。那有意義嗎? – Reado 2010-07-30 14:51:20

回答

3

因爲.*吞下一切,包括_。試試這個:

php -r 'echo preg_match("/([^_]*?)_UID-.*?\.PDF$/", "123_456_P1234_INV_UID-123456.PDF", $cat) ? $cat[1]."\n" : "";' 

更新,讀答案的評論對另一個答案後:

php -r 'echo preg_match("/([^_]*_UID-.*)\.PDF$/", "123_456_P1234_INV_UID-123456.PDF", $cat) ? $cat[1]."\n" : "";' 
+0

完美,謝謝! :) – Reado 2010-07-30 14:54:02

+0

兩者有什麼區別? – Reado 2010-07-30 15:14:02

+0

結束括號的位置。這取決於你是否想在INV之後擁有一切。 – Johan 2010-07-30 15:23:54

0

變化。 ?通過[^ _]

php -r 'echo preg_match("/_([^_]*)_UID-.*?\.PDF$/", "123_456_P1234_INV_UID-123456.PDF", $cat) ? $cat[1]."\n" : "";' 
+0

工作,謝謝! – Reado 2010-07-30 14:55:01

0

從()的使用,你只是想無論是在INV是否正確? 如果你確定在這個工作之後總會有一個UID,注意:INV不能包含_。

php -r 'echo preg_match("/_(.[^_]*?)_UID-.*?\.PDF$/", "123_456_P1234_INV_UID-123456.PDF", $cat) ? $cat[1]."\n" : "";'