顯示具有 php 標籤的文章。 顯示所有文章
顯示具有 php 標籤的文章。 顯示所有文章

2019年9月25日 星期三

php get_headers 判斷URL是否有效


在php中判斷一個文件或目錄是否存在,大家通常都會想到is_file和file_exists兩個函數。但這兩個函數再判斷一個遠程url文件是否存在的問題上還是會存在這樣那樣的問題。這裡作者將和大家分享一種利用php get_headers函數來判斷遠程url文件是有效否存在的辦法。

關於php get_headers函數的作用及用法,可以參考本站文章:

php get_headers函數的作用及用法

下面來具體說如何利用php get_headers卻判斷url的真實有效性。

通過該函數的介紹,我們可以知道對於這個函數簡單的說就是它返回的是一個HTTP請求的頭文件信息,信息格式基本如下:

(1)

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Sat, 29 May 2004 12:28:13 GMT
    [2] => Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
    [4] => ETag: "3f80f-1b6-3e1cb03b"
    [5] => Accept-Ranges: bytes
    [6] => Content-Length: 438
    [7] => Connection: close
    [8] => Content-Type: text/html
)

(2)

Array
(
    [0] => HTTP/1.0 404 Not Found
    [1] => Date: Sat, 29 May 2004 12:28:13 GMT
    [2] => Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
    [4] => ETag: "3f80f-1b6-3e1cb03b"
    [5] => Accept-Ranges: bytes
    [6] => Content-Length: 438
    [7] => Connection: close
    [8] => Content-Type: text/html
)

從以上兩種情況可以很容易看出,如果判斷該url是否有效存在肯定是通過數組中的第一個元素值來判斷的。服務器返回 200 即文件正確返回的意思,服務器返回 404 即文件不存在,因此從這個地方就可以很容易的判斷一個url的是否存在了

2018年8月29日 星期三

php 正則易碰到的問題

$s = '/a/b';

printf('<p>%s</p>', $s);
var_dump($s);

$res = preg_replace('/\//', '@', $s);

printf('<p>%s</p><hr>', $res);

//----------------------------

$s = '\\a\\b';
printf('<p>%s</p>', $s);
var_dump($s);

$res = preg_replace('/\\\\/', '@', $s);

printf('<p>%s</p><hr>', $res);
//----------------------------

$s = '\a\b';
printf('<p>%s</p>', $s);
var_dump($s);

$res = preg_replace('/\\\\/', '@', $s);

printf('<p>%s</p><hr>', $res);
----------------------------------------------------------

'/\\\\/' => php string = /\\/ => reg = /\/(匹配 '\')
'///' => php string = /// =>  reg = error
'/\//' => php string = /\// => reg = ///(匹配 '/')

----------------------------------------------------------
對 php preg來說  (/) 也屬於保留字
 ----------------------------------------------------------

PHP的跳脫字元



 對 "" 來說,對''無用
\$    顯示金錢符號 $
\"    顯示雙引號符號 "
\'    顯示單引號符號 '
\\    顯示倒斜線符號 \
\b    Backspace鍵
\n    換行符號<br>
\r    Return 歸位字元
\t    Tab鍵
\000 ~ \377    以16進位表示某一個字元
\x00 ~ \xFF    以8進位表示某一個字元

單引號 ' ' 是連跳脫字元都不處理,也就是 \n 會當成 \ 和 n ,而不是換行!這點要特別注意!很多 bug 就是由此而來,例如 str_replace \n 沒有作用之類的。
附帶一提,雖然單引號 ' ' 裡面不處理跳脫字元,但在單引號 ' ' 裡面要寫 (') 或 (\) 還是要記得跳脫一下,不然 PHP 會無法判斷字串結尾︰
<?php
  echo '\''; // 會印 '
  echo '\\'; // 會印 \
?> 
 

PHP preg_quote() 函數

PHP 正則表達式(PCRE)PHP 正則表達式(PCRE)
preg_last_error 函數用於轉義正則表達式字符。

語法

string preg_quote ( string $str [, string $delimiter = NULL ] ) preg_quote() 需要參數 str 並向其中 每個正則表達式語法中的字符前增加一個反斜線。 這通常用於你有一些運行時字符串 需要作為正則表達式進行匹配的時候。
正則表達式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
參數說明:
  • $str: 輸入字符串。
  • $delimiter: 如果指定了可選參數 delimiter,它也會被轉義。這通常用於 轉義 PCRE 函數使用的分隔符。 / 是最通用的分隔符。

返回值

返回轉義後的字符串。

實例

實例 1

<?php  
    $keywords = '$40 for a g3/400';
    $keywords = preg_quote($keywords, '/'); 
    echo $keywords; 
?>
執行結果轉義了 $ 和 / 特殊字符,如下所示:
返回 \$40 for a g3\/400

將文本中的單詞替換為斜體

<?php //在這個例子中,preg_quote($word) 用於保持星號原文涵義,使其不使用正則表達式中的特殊語義。 $textbody = "This book is *very* difficult to find."; $word = "*very*"; $textbody = preg_replace ("/" . preg_quote($word) . "/", "<i>" . $word . "</i>", $textbody); echo $textbody; ?>
執行結果如下所示:
This book is <i>*very*</i> difficult to find.
 



2018年8月21日 星期二

php 一些取得 object 資訊的 API


get_class(): 取得物件的 className

get_parent_class(): 取得物件繼承者的 className

get_object_vars():  返回類中所有的非靜態屬性

get_class_methods(): 函數的作用是返回由類的方法名組成的數組

2018年7月25日 星期三

php 讓 container 注入模組的方式

class Container {

    public $name = 'a';
    public $age = 19;
    public $load;

    public function __construct() {
        $this->load = new Loader($this);
    }

    public function getName() {
        printf('<p>%s</p>', $this->name);
    }

}

// 注入模組
class Loader {
    public $container;

    public function __construct($container) {
        $this->container = $container;
    }

    public function __get($name) {

        if (isset($this->container->$name)) {
            return $this->container->$name;
        }

    }

}

$a = new Container();

$load = $a->load;
var_dump($load->name);

2018年7月20日 星期五

php 取得最上層的 className

function getParentClassName($o) {
    $res = $o;

    while (TRUE) {

        $ref = new ReflectionClass($res);
        $r = $ref->getParentClass();

        if ($r) {
            $ref = $r;
        } else {
            break;
        }
        // className
        $res = $ref->getName();
    }

    return $res;
}

2018年6月30日 星期六

php &fn

Example1>>

<?php
function &_copy(){
   
    // 函數(&)的目的
    static $data = array();
    return $data;
}


// 呼叫函數還是需要&
$a = &_copy();
$a[] = 5;

// 呼叫函數還是需要&
$b = &_copy();

var_dump($a);
var_dump($b);
------------------------------------------------
Example2>>

function &xyz(Array &$d){
    return $d;
}

$data_1 = array(5, 1, 6);
$data_2 = &xyz($data_1);
//----------------------------
var_dump($data_2);
//----------------------------
sort($data_1);
var_dump($data_2);

2018年6月2日 星期六

php 檔案鎖定(檔案同步)

PHP flock() 函數

定義和用法

flock() 函數鎖定或釋放文件。
若成功,則返回 true。若失敗,則返回 false。

語法

flock(file,lock,block)
參數 描述
file 必需。規定要鎖定或釋放的已打開的文件。
lock 必需。規定要使用哪種鎖定類型。
block 可選。若設置為 1 或 true,則當進行鎖定時阻擋其他進程。

說明

flock() 操作的 file 必須是一個已經打開的文件指針。
lock 參數可以是以下值之一:
  • 要取得共享鎖定(讀取的程序),將 lock 設為 LOCK_SH(PHP 4.0.1 以前的版本設置為 1)。
  • 要取得獨佔鎖定(寫入的程序),將 lock 設為 LOCK_EX(PHP 4.0.1 以前的版本中設置為 2)。
  • 要釋放鎖定(無論共享或獨佔),將 lock 設為 LOCK_UN(PHP 4.0.1 以前的版本中設置為 3)。
  • 如果不希望 flock() 在鎖定時堵塞,則給 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中設置為 4)。

提示和註釋

提示:可以通過 fclose() 來釋放鎖定操作,代碼執行完畢時也會自動調用。
註釋:由於 flock() 需要一個文件指針, 因此可能不得不用一個特殊的鎖定文件來保護打算通過寫模式打開的文件的訪問(在 fopen() 函數中加入 "w" 或 "w+")。
-----------------------------------------------------------

例子

a_1.php>>

<?php

ob_start();

$filename = "a1.txt";

$file = fopen($filename, "r+");

$res = '';

// 排它性的锁定
if (flock($file, LOCK_EX)) {
    sleep(15);


    while(!feof($file)){
        $res .= fgets($file);
    }
    
    flock($file, LOCK_UN);
} else {
    echo "Error locking file!";
}

fclose($file);

printf('<p>finish(%s)</p>', $res);
----------------------------------------------------------- 

a_2.php>>

 <?php

ob_start();

$filename = "a1.txt";

$file = fopen($filename, "r+");

$res = '';

// 排它性的锁定
if (flock($file, LOCK_EX)) {
    
    while(!feof($file)){
        $res .= fgets($file);
    }
    
    flock($file, LOCK_UN);
} else {
    echo "Error locking file!";
}

fclose($file);

printf('<p>finish(%s)</p>', $res);

2018年5月11日 星期五

php 另一種引入其他 php檔的方法(處理模板,標籤命令的起手)

a.php>>

<?php
$d = 'hi.........';

$content = sprintf('?>%s', file_get_contents('b.php'));



// 解析,並執行 b.php 裡的內容
$s = eval($content);

// 備用,萬一執行裡面沒有 <?php ?>標籤
echo $s;

-----------------------------------------------------------------------------
b.php>>
printf('<h1>d = %s</h1>', @$d);

2018年4月26日 星期四

php 小技巧

※判斷是否開啟頁面,catch

if (ob_get_level() == 0) {
    // 尚未啟動 ob_start
    ob_start();
}
-----------------------------------------------
※判斷是否啟用 session

if (!isset($_SESSION)) {           
            session_start();
 }
-----------------------------------------------

2018年4月12日 星期四

CodeIgniter(getBaseUrl())

function getBaseUrl() {
    $path = $_SERVER['SCRIPT_NAME'];
    $serverName = $_SERVER['SERVER_NAME'];
    $port = $_SERVER['SERVER_PORT'];

    $path = preg_replace("/\/index.*/i", '', $path);

    $baseUrl = sprintf('%s:%s%s', $serverName, $port, $path);
    return $baseUrl;
}

2017年7月7日 星期五

underscore.php

http://brianhaveri.github.io/Underscore.php/


$result = __($data_1)->find(function($data) {
    return $data['value'] == 2;
});


2017年5月3日 星期三

(codeIgniter)筆記

網頁緩衝 >>

寫在 controller

$this­>output­>cache(5);

-----------------------------------------------------------------------
路由 >>

$route['test/([a-zA-Z]+)/\\1'] = 'test_2/classTest';

url(test/a/a) => 'test_2/classTest';


$route['test/\w+/\w+/(.*)'] = 'test_2/classTest/$1';  ($1區塊為收到的參數)

test1/5/6/..... => 'test_2/classTest/$1'

$route['test/\w+/\w+/(:any)'] = 'test_2/classTest/$1'; ($1區塊為收到的參數)

test1/5/6/..... => 'test_2/classTest/$1'

2017年1月17日 星期二

2017年1月11日 星期三

(php)CodeIgnite_路由規則

$route['test/([a-zA-Z]+)/\\1'] = 'test_2/classTest';

url(test/a/a) => 'test_2/classTest';


$route['test/\w+/\w+/(.*)'] = 'test_2/classTest/$1';  ($1區塊為收到的參數)
$route['test/\w+/\w+/(:any)'] = 'test_2/classTest/$1'; ($1區塊為收到的參數)