2012/06/15

導致 PHP 語法錯誤的 xml 標籤

處理到一個很奇怪的問題。

有個負責 echo 出 xml 內容的 php 程式,一直出現語法錯誤:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING your_file.php on line 123

your_file.php 是在 Windows 環境來的,在 Linux 內使用 Vim 開啓時,行尾會出現 Windows 的蠢符號 ^M

我如同往常一樣使用以下指令將 ^M 清除:
:%s/^M//g
(^M 是壓 Ctrl + V 再壓 Ctrl + M 的效果)

但是 123 行一直報錯,123 行的 php code 類似這樣:
<p id="$_GET['id']">

如果把 123 行註解掉,在 Vim 內的重新輸入一模一樣的內容,就 ok 了!
看起來是有些神祕的行尾符號,人類的肉眼無法察覺,待查 .....

Vim 有沒有好的外掛顯示 space、tab、break 啊!?

熱心的朋友們給了許多解法:
曼珠:":set invlist"可達到要求嗎?我自己試用是看的到行尾的 $,但我沒有其他的不可見符號所以沒辧法進一步測試。原來 :set invlist 是 invert list 的簡寫(等同 :set list!),而查詢 'list' 後發現他能顯示 ^I 和行尾,但對於其他不可見字元就沒多寫了,所以可能要再查。

雲端CrBoy+:把那行複製出來塞進新的檔案 用 hexdump 去看!

__CA__.py:vim -b abc.php ?

Chester Chang:try hex editor

Reference:
http://www.perturb.org/display/679_Make_Vim_show_hidden_characters.html
http://grx.no/kb/2008/11/17/remove-windows-line-endings-in-vim/
http://www.grok2.com/blog/2010/04/21/getting-rid-of-m-ctrl-m-characters-in-windows-text-using-vim/
http://stackoverflow.com/questions/799417/gvim-showing-carriage-return-m-even-when-file-mode-is-explicitly-dos

====================================================

後來發現根本不是行尾的問題!

該 php 檔中混合了 php tag 與 xml tag,例如:
<?php
    // code
?>
<?xml version="1.0" encoding="UTF-8" ?>
<?php 
    // code
    echo $XML 
?>

如果修改成以下格式,將 xml tag 使用 heredoc 輸出就正確了:
<?php
    // code

    echo <<<HERE
<?xml version="1.0" encoding="UTF-8" ?>
 HERE

    // code
    echo $XML 
?>

看起來是 php 與 xml 的 tag 讓 Web Server 混亂了,不是行尾有問題 ....