2010-02-22 106 views
0

我們的客戶向我們提供了需要使用PHP處理的XML數據。他們選擇通過使用大塊文本(包含換行符)來濫用屬性。 XML解析器用空格替換換行符以符合XML W3。需要使用PHP正則表達式替換換行符,但只能使用引號之間的換行符

爲了確保我們不會丟失我們的換行符,我想以字符串的形式讀入文件,然後使用雙引號將所有換行符翻譯爲
。我想我需要一個正則表達式,但是我遇到了麻煩。

這是我的測試代碼(PHP 5)到目前爲止,使用前視和查找落後,但它不工作:

$xml = '<tag attribute="Header\r\rFirst paragraph.">\r</tag>'; 
$pattern = '/(?<=")([^"]+?)\r([^"]+?)(?=")/'; 

print_r(preg_replace($pattern, "$1&#13;$2", $xml)); 

誰能幫助我得到這個權利?對於經驗豐富的正則表達式主人來說應該很容易:)

回答

1

最好的方法是逐字符地搜索。如果遇到引號,請將布爾值設置爲true,然後在找到匹配的引號時將其設置爲false。

如果你發現一個新的行字符,如果你在引號內(即你的變量是真的),那麼「翻譯&#13;」無論你的意思是什麼。否則,請保持獨立。

1

沒錯,那就是我最後的結局。對於未來的參考,我將張貼在這裏的工作代碼:

<?php 
    header("Content-Type: text/plain"); 

    $xml = '<tag attribute="Header\r\rFirst paragraph.">\r</tag>'; 

    // split the contents at the quotes 
    $array = preg_split('/["]+/', $xml); 

    // replace new lines in each of the odd strings parts 
    for($i=1;$i<count($array);$i+=2){ 
     $array[$i] = str_replace('\n\r','&#13;',$array[$i]); 
     $array[$i] = str_replace('\r\n','&#13;',$array[$i]); 
     $array[$i] = str_replace('\r','&#13;',$array[$i]); 
     $array[$i] = str_replace('\n','&#13;',$array[$i]); 
    } 

    // reconstruct the original string 
    $xml = implode('"', $array); 

    print_r($xml); 
?> 

謝謝回覆和支持該解決方案:)

+0

也許這將足以只需更換* *任何換行符你' 遇到'?我的意思是,換行符在XML中是(應該是)微不足道的,因此您可以在標籤之間替換換行符而不會破壞任何內容。不要忘記也要替換TAB字符。 – Tomalak 2010-02-22 17:29:24

相關問題