2011-12-08 47 views
0

這個問題的PHP's preg_match_all() to pull out all php tagspreg_match_all()PHP標籤不在引號內

我需要擴展這個正則表達式/<\?.*?(?:\?>|$)/s時,發現單或雙引號內的標籤不符合第2部分。這將涉及反向引用匹配的引用類型,這超出了我對正則表達式的直覺理解。


示例HTML:

<? 
    // Test xml 
    $this->_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 
    $this->_xml .= "<TransferredValueTxn xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" >\n"; 
    $this->_xml .= "<?=$test?> <TransferredValueTxnReq>" . trans("test") . "\n"; 
?> 

希望的結果:

[0] => "<? 
    // Test xml 
    $this->_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 
    $this->_xml .= "<TransferredValueTxn xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" >\n"; 
    $this->_xml .= "<?=$test?> <TransferredValueTxnReq>" . trans("test") . "\n"; 
?>" 

回答

0

以供將來參考:/<\?(?:.*?(?:(\"|').*?[^\\]\1)*)*(?:\?>|$)/s

我所有的單元測試工作完美。

1

如果你想用PHP解析PHP,你可能想使用試用token_get_all()功能。它會爲你做很多工作,使用與PHP使用相同的引擎來解析正在運行的代碼。

+0

我並不積極,但據我所知,'token_get_all()'不會用內聯PHP解析HTML。這是我想要實現的。 –

+0

它應該!請注意,只有啓用了短標籤時,它纔會識別'<?',儘管如同「真實」解釋器一樣。 – duskwuff