2019年9月28日 星期六
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來說 (/) 也屬於保留字
----------------------------------------------------------
對 "" 來說,對''無用
\$ 顯示金錢符號 $
\" 顯示雙引號符號 "
\' 顯示單引號符號 '
\\ 顯示倒斜線符號 \
\b Backspace鍵
\n 換行符號<br>
\r Return 歸位字元
\t Tab鍵
\000 ~ \377 以16進位表示某一個字元
\x00 ~ \xFF 以8進位表示某一個字元
單引號 ' ' 是連跳脫字元都不處理,也就是 \n 會當成 \ 和 n ,而不是換行!這點要特別注意!很多 bug 就是由此而來,例如 str_replace \n 沒有作用之類的。
附帶一提,雖然單引號 ' ' 裡面不處理跳脫字元,但在單引號 ' ' 裡面要寫 (') 或 (\) 還是要記得跳脫一下,不然 PHP 會無法判斷字串結尾︰
PHP 正則表達式(PCRE)
preg_last_error 函數用於轉義正則表達式字符。
正則表達式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
參數說明:
執行結果轉義了 $ 和 / 特殊字符,如下所示:
返回 \$40 for a g3\/400
執行結果如下所示:
This book is <i>*very*</i> difficult to find.
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)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);
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;
}
$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);
<?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);
<?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();
}
-----------------------------------------------
if (ob_get_level() == 0) {
// 尚未啟動 ob_start
ob_start();
}
-----------------------------------------------
※判斷是否啟用 session
if (!isset($_SESSION)) {
session_start();
}
-----------------------------------------------
2018年4月19日 星期四
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;
}
$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;
});
$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'
寫在 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區塊為收到的參數)
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區塊為收到的參數)
訂閱:
文章 (Atom)










