2013-03-01 147 views
2

我需要一些標籤內的值在評論PHP文件這樣非貪婪的正則表達式

php code 
/* this is a comment 
!- 
<titulo>titulo3</titulo> 
<funcion> 
    <descripcion>esta es la descripcion de la funcion 6</descripcion> 
</funcion> 
<funcion> 
    <descripcion>esta es la descripcion de la funcion 7</descripcion> 
</funcion> 
<otros> 
    <descripcion>comentario de otros 2a hoja</descripcion> 
</otros> 
-! 
*/ 
some php code 

所以你可以看到該文件有新行和像<funcion></funcion>標籤repetions,我需要讓每一個單標籤中的一個,所以我想是這樣的:

preg_match_all("/(<funcion>)(.*)(<\/funcion>)/s",$file,$matches); 

這個例子的工作原理與新行,但其貪婪的,所以我一直在尋找,看到這兩個解決方案:

preg_match_all("/(<funcion>)(.*?)(<\/funcion>)/s",$file,$matches); 
preg_match_all("/(<funcion>)(.*)(<\/funcion>)/sU",$file,$matches); 

,但他們沒有工作對我來說,不知道爲什麼

+7

只是解析XML。 – Blender 2013-03-01 03:49:05

+0

@Blender它不是一個真正的XML,它應該是在一個PHP文件的評論..我會編輯它,所以它更清晰 – 2013-03-01 03:53:05

+1

我寫了一個答案,但我只是意識到,第一個例子(實際上第二)你發佈實際上完美的作品。 – rmobis 2013-03-01 03:58:15

回答

0

嘗試,而不是使用.[\s\S],這意味着所有的空間和非空格字符。此外,無需在比賽組中添加​​和</funcion>

/<funcion>([\s\S]*?)<\/funcion>/s 

而且,記住,要做到這一點的最好辦法是解析使用XML parser的XML。即使它不是一個XML文檔,就像您在註釋中提到的一樣,請提取應該解析的部分並使用XML解析器來解析它。

+0

的事情是,當我使用'*?'我的代碼似乎不工作,我不知道爲什麼 – 2013-03-01 04:00:58

1

嘗試此..

/<funcion>((.|\n)*?)<\/funcion>/i 

例如

$srting = "<titulo>titulo3</titulo> 
<funcion> 
    <descripcion>esta es la descripcion de la funcion 6</descripcion> 
</funcion> 
<funcion> 
    <descripcion>esta es la descripcion de la funcion 7</descripcion> 
</funcion> 
<otros> 
    <descripcion>comentario de otros 2a hoja</descripcion> 
</otros>"; 

$result=preg_match_all('/<funcion>((.|\n)*?)<\/funcion>/i', $srting,$m); 
print_r($m[0]); 

這一個輸出

Array 
(
    [0] => 
    esta es la descripcion de la funcion 6 

    [1] => 
    esta es la descripcion de la funcion 7 

) 

DEMO

1

這個表達式從你的問題:

preg_match_all("/(<funcion>)(.*?)(<\/funcion>)/s", $file, $matches); 
print_r($matches); 

這是可行的,但前提是$file包含XML的字符串;如果它是一個文件名,你必須首先得到的內容:

preg_match_all("/(<funcion>)(.*?)(<\/funcion>)/s", file_get_contents($file), $matches); 

另外,請記住,PCRE有backtrack limitations當您使用非貪婪模式。

1

。 。如果結構完全如此(總是在內容中縮進),您可以很容易地將它與/\ n [\ s] +([^ \ n] +(\ n [\ s] +)*)\ n/

。 。我總是傾向於避免「懶惰」(「非貪婪」)修飾符。它只是一種看起來像黑客,並不是隨處可見,並且具有相同的實現。既然在這種情況下你好像不是需要吧,我建議你不要使用它。

。 。試試這個:

$regexp = '/<funcion>\n[\s]+([^\n]+(\n[\s]+)*)\n</funcion>/'; 
$works = preg_match_all($regexp, $file, $matches); 
echo '<pre>'; 
print_r($matches); 

。 。 「$ matches [1]」數組將爲您提供一組「funcion」標籤內容。

。 。當然,預先過濾內容並將RegExp應用於評論內容以避免任何不匹配是很好的做法。

。 。玩的開心。

+1

爲什麼過度複雜呢? – rmobis 2013-03-01 04:23:43

+0

@Raphael_我學會了使用正則表達式儘可能嚴格,以便它們不會匹配不一致的數據(並且您會更輕鬆地檢測到這些數據)。這不是關於_overcomplicating_,只是在模式上稍微嚴格些。我的例子只適用於正確縮進的內容,並且還會返回更清晰的結果(已經「修剪」)。 – 2013-04-29 03:19:07