PHP:需要使用的preg_match提取字符串的某些部分()

PHP:需要使用的preg_match提取字符串的某些部分()

问题描述:

我尝试提取下面的字符串“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

因为.*吞下一切,包括_。试试这个:

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

变化。 ?通过[^ _]

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

从()的使用,你只是想无论是在INV是否正确? 如果你确定在这个工作之后总会有一个UID,注意:INV不能包含_。

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