2025年7月19日 星期六

【PHP教學】善用Notepad++的正規表示式,告別未加引號的字串索引寫法

身為一位PHP開發者,您是否曾經因為舊專案中大量未加引號的字串索引,而在升級PHP版本時感到困擾?隨著PHP 8.2正式棄用未加引號的字串索引,過去的寫法將會在新版環境中引發錯誤。想一次修正卻又不知從何下手嗎?本文將教您如何使用強大的文字編輯器Notepad++,搭配正規表示式(Regular Expression),一次性解決這個惱人的問題。在解決過程中,我們也將參考Copilot與AI Studio等AI工具提供的建議,讓您更有效率地完成修正。

問題的根源:為何要修正未加引號的字串索引?

在舊版的PHP中,直接使用如 $_GET[id] 這樣的寫法是可行的。然而,這種寫法在語法上不夠嚴謹,PHP直譯器會先將 id 視為一個常數,當找不到對應的常數時,才會再把它當作字串 'id' 來處理。這不僅會有效能上的耗損,也可能在未來版本的PHP中造成非預期的錯誤。

事實上,從 PHP 8.2 開始,這種未加引號的字串索引寫法已經被正式棄用。這意味著,過去能正常運作的程式碼,在新的PHP環境下將會產生錯誤或警告。為了確保程式碼的穩定性與未來的相容性,一次性將這些不規範的寫法修正過來,是刻不容緩的任務。

解決方案:利用Notepad++正規表示式進行批次取代

面對動輒數百甚至數千行的舊程式碼,手動逐一修改顯然不切實際。這時候,善用文字編輯器的尋找與取代功能,特別是支援正規表示式的Notepad++,就能發揮極大的效益。

我們要處理的目標是將 $_GET[id]$_POST[data]$_SESSION[user] 等寫法,修正為正確的 $_GET['id']$_POST['data']$_SESSION['user'] 格式。

  • 尋找目標 (Find what):

    Generated regex
    (\$_(GET|POST|REQUEST|SESSION|COOKIE|FILES|ENV|SERVER))\[([a-zA-Z_][a-zA-Z0-9_]*)\]
  • 取代為 (Replace with):

    Generated regex
    $1['$3']

正規表示式解說:

  • (\$_(GET|POST|REQUEST|SESSION|COOKIE|FILES|ENV|SERVER)):這部分會比對PHP中常見的全域變數(Superglobals)。

    • \$:比對錢號 $ 符號。

    • _:比對底線符號。

    • (GET|POST|...):使用 | (或) 來比對多個可能的變數名稱,並用括號 () 將它們群組起來,成為第一個捕捉群組 ($1)。

  • \[:比對左邊的中括號 [

  • ([a-zA-Z_][a-zA-Z0-9_]*):這部分用來比對中括號內的索引字串。

    • [a-zA-Z_]:比對任何一個大小寫字母或底線,確保索引名稱的開頭是合法的。

    • [a-zA-Z0-9_]*:比對任意數量的大小寫字母、數字或底線。

    • (...):將整個索引字串設定為第三個捕捉群組 ($3)。

  • \]:比對右邊的中括號 ]

  • 取代語法中的  分別代表在「尋找目標」中被第一個和第三個括號 () 所捕捉到的內容。

除了陣列索引的問題,舊程式碼中也可能包含 <?= 或 <? 這種簡短的PHP起始標籤。雖然在某些伺服器設定下依然可用,但為了維持程式碼的一致性與可攜性,建議將其轉換為標準的 <?php echo 或 <?php 寫法。

  1. 修正 

    • 尋找目標 (Find what):

      Generated regex
      <\?=([\s\S]*?)\?>
    • 取代為 (Replace with):

      Generated regex
      <?php echo $1 ?>
      Regex
  2. 修正 

    • 尋找目標 (Find what):

      Generated regex
      <\?(?!php|=)
    • 取代為 (Replace with):

      Generated regex
      <?php 

正規表示式解說:

  • <\?=([\s\S]*?)\?>

    • <\?=:比對 <?= 字串。

    • ([\s\S]*?):這是一個非貪婪比對,會捕捉 <?= 和 ?> 之間的所有字元,包含換行符。\s 代表空白字元,\S 代表非空白字元,合起來就代表任何字元。

    • \?>:比對 ?> 結尾。

  • <\?(?!php|=)

    • <\?:比對 <? 字串。

    • (?!php|=):這是一個負向先行斷言 (Negative Lookahead),它會確保 <? 後面不是接著 php 或 =,如此一來才不會影響到原本就正確的 <?php 或 <?= 寫法。

操作流程

  1. 在Notepad++中開啟您的專案資料夾。

  2. 按下 Ctrl + H 開啟「尋找與取代」視窗。

  3. 在「尋找目標」與「取代為」欄位中,分別貼上對應的正規表示式。

  4. 在「搜尋模式」中,務必選擇「正規表示式 (Regular expression)」。

  5. 點擊「全部取代 (Replace All)」或「在所有開啟的檔案中取代 (Replace in All Opened Documents)」,即可完成批次修正。

透過以上步驟,您就可以輕鬆地將舊專案中不符合規範的PHP程式碼,一次性地修正完畢。這不僅能確保您的程式碼能夠在新的PHP版本中順利運行,更能提升程式碼的品質與可維護性。下次當您面對類似的程式碼升級挑戰時,不妨也試試看利用Notepad++與正規表示式,體驗高效解決問題的樂趣!



沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。

【AppSheet 教學】如何快速製作每日喝水統計 APP

今天我們要來教學如何使用 AppSheet,快速地製作一個每日喝水統計的應用程式(APP)。這次的教學將會使用 Dropbox 作為我們的資料來源,因為 Dropbox不像 Google Sheets 那樣有類似試算表的直接輸入方式,所以我們需要先在 Excel 中建立好我們的資...