Jex’s Note

PHP - RegExp(正則表達式) 語法

preg_match

return preg_match('/pattern/flag', $str);    //返回TRUE, FALSE

preg_replace

example 1

$str = 'aabbccddeeffccggii';
$str = preg_replace('/cc/', '\\1(cc)被取代了', $str);

結果為 : aabb(cc)被取代了ddeeff(cc)被取代了ggii

example 2

$str = 'qq-qq-QQ';
$reg = '/qq/';
echo preg_replace($reg,'哈',$str);    //參數分別為 (pattern , 要取代的字串 , 原字串)

結果為 : 顯示結果為 : 哈-哈-QQ

取得比對結果存進正則變數

(1)

$str = 'aabbccddeeffccggiiCC';
$str = preg_replace('/cc/i', "[\\0]", $str);    //忽略大小寫 , 結果為 : aabb[cc]ddeeff[cc]ggii[CC]
echo $str;

\\0 是取得比對到的字串 , 我們將比對到的字串加上中括號。 似乎pattern未加上括號只能用\0去取變數

(2)

$str = 'aabbccddeeffccggiiCC';
$str = preg_replace('/(cc)/i', "[\\1]", $str);    //忽略大小寫 , 結果為 : aabb[cc]ddeeff[cc]ggii[CC]
echo $str.'<br>';

註 : pattern 對要比對的字串加上括號 , \\1 是取得比對到的字串 , 最後將比對到的字串加上中括號

其他

pattern escape

  • / : \\/
  • ( : \(
  • ) : \)
  • . : \.

擲出第一張長寬各大於100的圖, 如果都沒有就擲第一張圖

$url = $this->input->get_post('url');
if ( ! $html_content = @file_get_contents($url))
{
    return $this->_outputJSON(array('status' => 'fail', 'error' => 'Wrong url'));
}
$patten = "/<img.*src=\"(((http[s]?):\/\/|www\.)([^\s\[\\\"'])+)\".*>/";
if (preg_match_all($patten, $html_content, $matches, PREG_SET_ORDER))
{
    foreach ($matches as $match)
    {
        list($width, $height) = getimagesize($match[1]);
        if ($width >= 100 OR $height >= 100)
        {
            return $this->_outputJSON(array('status' => 'ok', 'url' => $match[1]));
        }
    }
    return $this->_outputJSON(array('status' => 'ok', 'url' => $matches[0][1]));
}
return $this->_outputJSON(array('status' => 'fail', 'error' => 'Image not found'));

如果只要單一match的話使用

if (preg_match($patten, $html_content, $matches, PREG_OFFSET_CAPTURE))

比對 src=" ... " 符合相對路徑的 path

$reg = '(src=["|\'](?!.*(http[s]?))(?!.*(www\.))[\/]?(([^\s\[\\"\'])+)["|\'])';

match連結並且顯示頭4個字元

$message = 'google : www.google.com.tw ,yahoo : http://www.google.com.tw';
$message = preg_replace("/(((http[s]?):\/\/|www\.)([^\s\[\\\"'])+)/", substr("$0", 0, 4), $message);
echo $message;

錯誤結果:

    google : www.google.com.tw ,yahoo : http://www.google.com.tw

match到但放到substr裡沒反應

改成:

$message = 'google : www.google.com.tw ,yahoo : http://www.google.com.tw';
$message = preg_replace_callback(
    "/(((http[s]?):\/\/|www\.)([^\s\[\\\"'])+)/",
    function ($matches) {
        if (substr(strtolower($matches[0]), 0, 4) == 'www.')
        {
            return '<a href="http://'. $matches[0] .'" target="_blank">'. $matches[0] .'</a>';
        }
        return '<a href="'. $matches[0] .'" target="_blank">'. $matches[0] .'</a>';
    },
    $message
);
return $message;

得到預期的結果:

google : www. ,yahoo : http

Comments