2012-10-11 52 views
1

簡單與換行符提取註釋的正則表達式的問題:PHP正則表達式斷行

字符串:

<description language="de">Diese Tabelle zeigt die Zugangswege der Besucher auf die Website</description> 

    <options> 
     <!-- Hier stehen die Optionen für den View, die sich nicht auf colums beziehen. 
      Bisher gibt es da nix, kann aber mal nicht schaden das vorzusehen --> 
    </options> 


    <defaultcolumn> 
     <!-- Hier können für Basiswerte für alle Spalten definiert werden. 
      Die Spaltendefinition weiter unten gibt die Möglichkeit die Werte je Spalte zu überschreiben 
      Welche Optionen es gibt (incl. Titel, Description und Emptycelltext) siehe "allvaluescolumn" oben. 
     --> 
     <options> 
     <option name="align" value="left"><!-- (left|center|right), default left --></option> 

我的正則表達式的嘗試:

/<!--(.*)-->/ 

這將提取所有單行註釋。

問:

我如何獲得的所有評論?也是多行的?添加\n\r\n\未成功。

<!-- get me (linebreak) me also -->

回答

1

嘗試

/<!--(.*?)-->/s 

.比賽每默認沒有換行符,所以你需要在正則表達式的分隔符後,爲使dotall模式與s。 (ssingleline改性劑,它把整個字符串作爲一個單一的線,即,使該點匹配也換行符。)

然後,我提出的量詞ungreedy通過添加後一個?,否則會匹配來自第一打開標籤到最後一個結束標籤。

+0

完美的作品。謝謝。在7分鐘內接受。 – Patrick

+0

@Azincourt你忘了嗎? – Daedalus

+0

是的。正在工作... – Patrick

2

正確的方式做到這一點,因爲人們常常用(X)HTML/XML字符串處理時的情況下,是不使用正則表達式的所有,而是使用DOMXPath

要獲取文檔中的所有批註,您想要的XPath查詢是:

//comment() 

例如:

$str = '<description language="de">Diese Tabelle zeigt die Zugangswege der Besucher auf die Website</description> 

<options> 
    <!-- Hier stehen die Optionen für den View, die sich nicht auf colums beziehen. 
     Bisher gibt es da nix, kann aber mal nicht schaden das vorzusehen --> 
</options> 


<defaultcolumn> 
    <!-- Hier können für Basiswerte für alle Spalten definiert werden. 
     Die Spaltendefinition weiter unten gibt die Möglichkeit die Werte je Spalte zu überschreiben 
     Welche Optionen es gibt (incl. Titel, Description und Emptycelltext) siehe "allvaluescolumn" oben. 
    --> 
    <options> 
    <option name="align" value="left"><!-- (left|center|right), default left --></option>'; 

$doc = new DOMDocument('1.0'); 
@$doc->loadHTML($str); 
$xpath = new DOMXPath($doc); 

$nodes = $xpath->query('//comment()'); 

$comments = array(); 

foreach ($nodes as $node) { 
    $comments[] = trim($node->nodeValue); 
} 

print_r($comments); 

See it working

+0

感謝您的回答,但是我想要一個正則表達式解決方案。我會使用xpath作爲未來的東西。 – Patrick

+2

@Azincourt,我建議你使用這個答案,而不是使用正則表達式。當面對更復雜的問題時,不僅正則表達式非常困難,而且XPath是一個對象 - 一種專門用於在這些類型的字符串中搜索的工具。 – Sem

+0

其實我現在不是在生產中使用它,而是使用簡短的代碼片段。我只是想刪除一個文件中的評論,並想知道爲什麼我的正則表達式是錯誤的。這就是爲什麼我說我將來會使用它。 – Patrick