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月26日 星期日

php 取得檔案資訊

[PHP] 取得檔案的資訊(檔案、路徑...等等) 或 網頁的目錄(或根目錄)

當我們需要用PHP網頁進行一些檔案操作,我們需要知道相關檔案名稱、目錄名稱或存放位置...等資訊,所以PHP有提供一些函式讓我們可以取得這些資訊...
假設我們的網頁是放在根目錄下的test資料夾中,檔案名稱為myweb.php

1、取得目前網頁的檔案路徑及檔案名稱:
$path=$_SERVER[PHP_SELF];
echo $path; //輸出結果:/test/myweb.php

2、利用pathinfo()搭配$path取得更多資訊:
$path_parts = pathinfo($path);  //這邊的$path_parts會是一個陣列,裡面的元素就是我們要的資訊。
echo $path_parts['dirname'];  //輸出結果:/test
echo $path_parts['basename'];  //輸出結果:myweb.php
echo $path_parts['extension'];  //輸出結果:php
echo $path_parts['filename'];  //輸出結果:myweb

3、取得真實的電腦存放位置:
echo realpath($path['basename']);  //輸出結果:C:\AppServ\www\test\111.php

4、取得網頁的目錄、根目錄或路徑
應用方式舉例如下,請自行搭配各種變數去套用
$host='http://'.$_SERVER['SERVER_NAME'].'/'.$x;

2018年8月21日 星期二

php 一些取得 object 資訊的 API


get_class(): 取得物件的 className

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

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

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

2018年8月16日 星期四

_getl __set

abstract class Object {

    public function 
__get($strProperty) {
        
$objReflect = new ReflectionClass($this);
        
$strProperty strtoLower($strProperty[0]) . substr($strProperty1);

        foreach (
$objReflect->getDefaultProperties() as $key => $strProp) {
            
$key strtoLower($key[0]) . substr($key1);
            if (
$key == $strProperty) {
                return 
$this->{$key};
            }
        }
    }

    public function 
__set($strProperty$strData) {
        
$objReflect = new ReflectionClass($this);
        
$strProperty strtoLower($strProperty[0]) . substr($strProperty1);

        foreach (
$objReflect->getDefaultProperties() as $key => $strProp) {
            
$key strtoLower($key[0]) . substr($key1);
            if (
$key == $strProperty) {
                
$this->{$key} = $strData;
            }
        }
    }

================================================================================
import java.lang.reflect.Field;
import java.lang.reflect.Type;

public class test {
 /* …… Private vars …… */
  private int var1;
  private char var2;
  private long var3;
  private Integer var4;
  private String var5;
 /* …… Public functions …… */
  public void set_vars() {
   var1 = 42;
   var2 = 41;
   var3 = 40;
   var4 = Integer.valueOf(39);
   var5 = "Hello world";
  }
  public Object get(String var_name) throws Exception {
   System.out.print("getlled: ");
   Field f = this.getClass().getDeclaredField(var_name);
   Type t = f.getGenericType();
   String type_name = t.toString();
   if (type_name.equals("boolean")) {
    return Boolean.valueOf(f.getBoolean(this)); }
   else if (type_name.equals("byte")) {
    return Byte.valueOf(f.getByte(this)); }
   else if (type_name.equals("char")) {
    return Character.valueOf(f.getChar(this)); }
   else if (type_name.equals("double")) {
    return Double.valueOf(f.getDouble(this)); }
   else if (type_name.equals("float")) {
    return Float.valueOf(f.getFloat(this)); }
   else if (type_name.equals("int")) {
    return Integer.valueOf(f.getInt(this)); }
   else if (type_name.equals("long")) {
    return Long.valueOf(f.getLong(this)); }
   else if (type_name.equals("short")) {
    return Short.valueOf(f.getShort(this)); }
   else {
    return f.get(this); }
  }
  public Object set(String var_name, Object var_value) {
   /* Analogous to the universal getter; use the functions
    *  Field.set*(Object obj, * value)
    * and
    *  Field.set(Object obj, Object value)
    * as seen on http://java.sun.com/javase/6/docs/api/java/lang/reflect/Field.html
   */
   return null;
  }
 /* …… Main …… */
  public static void main(String[] argv) {
   test b = new test();
   b.set_vars();
   try {
    System.out.println(b.get("var1    System.out.println(b.get("var2    System.out.println(b.get("var3    System.out.println(b.get("var4    System.out.println(b.get("var5}
   catch (Exception e) {
    System.out.println("OMG An exception!"); }
  }
};

2018年8月10日 星期五

php function.apply

call_user_func_array()

for static functions, use
forward_static_call_array().

2018年8月2日 星期四

php uri_query 相關

 $query = 'z[]=5&y=8&z[]=9';

----------------------------------------------------------------------
$queryArray = array();

parse_str($query, $queryArray);

$queryArray =

array (size=2)
  'z' => 
    array (size=2)
      0 => string '5' (length=1)
      1 => string '9' (length=1)
  'y' => string '8' (length=1)
----------------------------------------------------------------------

$query=array(
'id'=>1,
'title'=>2
);
$res = http_build_query($query);


$res = id=1&title=2

----------------------------------------------------------------------

parse_url()

  • scheme - e.g. http
  • host
  • port
  • user
  • pass
  • path
  • query - after the question mark ?
  • fragment - after the hashmark #