2010-08-02 77 views
1

我有點卡住在php中使用preg_match()捕獲一個組。php捕獲組

這是我的模式:

<ns2:uniqueIds>(.*)<\/ns2:uniqueIds> 

這是源:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header/><env:Body><ns2:ListResponse xmlns:ns2="http://censored"><ns2:uniqueIds>censored</ns2:uniqueIds><ns2:uniqueIds>censored</ns2:uniqueIds></ns2:ListResponse></env:Body></env:Envelope> 

我缺少什麼?

+9

每當有人解析XML與正則表達式它使嬰兒耶穌哭了。 – cletus 2010-08-02 09:42:37

+0

你想做什麼? – relet 2010-08-02 09:42:47

+0

cletus,解析它與simplexml_load_string()(或任何該函數被稱爲,失敗了我NuSoap失敗了我內置的PHP肥皂失敗了我沒有看到任何其他選項,那麼這 – Yustme 2010-08-02 11:30:22

回答

5

雖然我同意上面那些告訴你不使用正則表達式來解析XML的人,但我可以明白你爲什麼只是爲了獲取一些價值。這就是我如何設法使其工作:

PHP解釋器例如:

php > $s = '<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header/><env:Body><ns2:ListResponse xmlns:ns2="http://censored"><ns2:uniqueIds>censored</ns2:uniqueIds><ns2:uniqueIds>censored</ns2:uniqueIds></ns2:ListResponse></env:Body></env:Envelope>'; 
php > $p = '#<ns2:uniqueIds>(.*?)<\/ns2:uniqueIds>#i'; 
php > $a = array(); 
php > preg_match($p, $s, $a); 
php > print_r($a); 
Array 
(
    [0] => <ns2:uniqueIds>censored</ns2:uniqueIds> 
    [1] => censored 
) 

只是,我已經給你的模式中所做的更改是,我已經使用了惰性限定符*?而不僅僅是*(這是貪婪的)。

來源:

+0

我同意他們,但就像我說的,所有其他選項失敗我。但是,如果任何人都可以解析XML字符串,並取得標籤名稱「價值」的價值,我很樂意使用來代替。 – Yustme 2010-08-02 13:16:19

+0

沒有worksy? 哦,如果你有興趣你uniqueIds的不止一個,你應該preg_match_all使用。 – 2010-08-02 13:35:49

+0

你爲什麼接受我的回答,然後......不接受?有什麼不工作? – 2010-08-04 20:59:42

0

你或許應該使用native SoapClient而不是使它更容易既調用WebService的以及得到的結果作爲PHP本地數據類型..

使用正則表達式解析XML或HTML通常是(很) 餿主意。

+0

因爲它不工作。是與服務器的問題,我沒有訪問它。你能告訴我,我做錯了什麼? – Yustme 2010-08-02 11:31:14