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

时间:2010-07-30 14:44:45

标签: php

我尝试提取下面字符串的“INV”部分:

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部分?

3 个答案:

答案 0 :(得分: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" : "";'

答案 1 :(得分:0)

改变。?通过[^ _]

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

答案 2 :(得分:0)

从()使用你只想要 INV 中的任何内容正确吗? 如果您确定在此之后总是有UID,请注意:INV不能包含_。

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