Close

Not a member yet? Register now and get started.

lock and key

Sign in to your account.

Account Login

Forgot your password?

PHP preg_replace 使用注意事項

preg_replace http://www.php.net/manual/en/function.preg-replace.php

當使用 preg_replace 作關鍵字批次 pattern 替換時, 要小心避免關鍵字巢狀替換的問題, 要先替換成獨一無二的代碼,再從代碼替換回來。

錯誤用法:

<?php
// 以下將替換成:
// 北捷<a href="#2"><a href="#3">蘆洲</a>線</a>通車,悠遊卡免費試乘1個月
$string = '北捷蘆洲線通車,悠遊卡免費試乘1個月';
$pattern = $replace = array();
$pattern[0] = '/蘆洲站/';
$pattern[1] = '/蘆洲線/';
$pattern[2] = '/蘆洲/';
$replace[0] = '<a href="#1">蘆洲站</a>';
$replace[1] = '<a href="#2">蘆洲線</a>';
$replace[2] = '<a href="#3">蘆洲</a>';
$string = preg_replace($pattern, $replace, $string);
echo $string . '<br />' . PHP_EOL;
?>

正確用法:

<?php
// 以下將替換成:
// 北捷<a href="#2">蘆洲線</a>通車,悠遊卡免費試乘1個月
$string = '北捷蘆洲線通車,悠遊卡免費試乘1個月';
$pattern = $replace = array();
$patternTemp = $replaceTemp = array();
$pattern[0] = '/蘆洲站/';
$pattern[1] = '/蘆洲線/';
$pattern[2] = '/蘆洲/';
$replace[0] = '<a href="#1">蘆洲站</a>';
$replace[1] = '<a href="#2">蘆洲線</a>';
$replace[2] = '<a href="#3">蘆洲</a>';
$patternTemp[0] = '/{DS_CODE_0}/';
$patternTemp[1] = '/{DS_CODE_1}/';
$patternTemp[2] = '/{DS_CODE_2}/';
$replaceTemp[0] = '{DS_CODE_0}';
$replaceTemp[1] = '{DS_CODE_1}';
$replaceTemp[2] = '{DS_CODE_2}';
$string = preg_replace($pattern, $replaceTemp, $string);
$string = preg_replace($patternTemp, $replace, $string);
echo $string . '<br />' . PHP_EOL;
?>

另外在使用 preg_replace 作字串比對替換時,若 DB 為 BIG5 編碼,也要小心雙位元字碼交錯,
所造成的比對錯誤問題,
這裡在處理時要特別小心,免得一失足成千古恨哭

  1. 先將 程式本身轉為 UTF8 (無BOM) 編碼,以便程式內的字串資料轉為 UTF8 編碼。
  2. 從 BIG5 編碼 DB 抓出資料後先轉成 UTF8 編碼。
  3. 進行 preg_replace 字串比對替換。
  4. 最後進 DB 前,再將 UTF8 轉回 BIG5 編碼。

 

Leave a Reply

*