簡體   English   中英

Parse String PHP中的正則表達式值數組

[英]Parse String Array of regex values within PHP

我使用它的方式的組合很復雜,我找不到任何關於如何實現它的參考。

我允許用戶在數據庫(MySql)中存儲正則表達式值數組的表示,如下所示:

'["/^\d{5}([\-]?\d{4})?$/i", "/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/i"]'

現在在我的PHP代碼中,我將其讀入變量$val ,它看起來像這樣:

'["/^\\d{5}([\\-]?\\d{4})?$/i", "/^([ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ])\\ {0,1}(\\d[ABCEGHJKLMNPRSTVWXYZ]\\d)$/i"]'

並嘗試利用JSON將其解碼為實際數組:

$val = '{"unq":'.$val.'}';
$obs = json_decode($val);
return $obs->unq;

問題是,我得到Notice: Trying to get property of non-object in...$obs->unq;Notice: Trying to get property of non-object in... $obs->unq;

我猜這與正則表達式的存儲方式有關,但我不確定。 感謝您的幫助,浪費了太多時間。

它似乎是你的解析器(mysqli_real_escaped_string或其他東西)不會逃避json字符串中預期的任何結構字符(我猜的unicode字符除外)

正如您可以在JSON RFC中讀到的,應該轉義字符串轉義斜杠 (向前或向后)!

“字符串的表示類似於C系列編程語言中使用的約定”

然后,您可以使用addcslashes來轉義它:

$reg = addcslashes($reg, chr(0x5c)); // hex notation, beware of '\\'
$out = '{"unq":'.$reg.'}';
$out = json_decode($out);

暗示

您應該使用本機調試函數(如var_dump和json錯誤處理程序)來確保發生錯誤的位置:

var_dump(json_last_error_msg(), $out);
return $out->unq;

錯誤的方式:

string(12) "Syntax error"
NULL

解決了:

string(8) "No error"
object(stdClass)#1 (1) {
  ["unq"]=>
  array(2) {
    [0]=>
    string(23) "/^\d{5}([\-]?\d{4})?$/i"
    [1]=>
    string(86) "/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/i"
  }
}

存儲

我不知道你的目的,但還有另一種方法來幫助這個存儲之王。 您還可以序列化真正的正則表達式數組

// before saving
$patterns = serialize
([
    "/^\d{5}([\-]?\d{4})?$/i",
    "/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/i",
]);

// usage out of mysql, unserialize do the tricks
return $patterns = unserialize($sqlressource["patterns"]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM