簡體   English   中英

使用preg_split獲取關聯數組

[英]Get associative array using preg_split

我的下面的正則表達式有2個問題:

1)輸出在開頭和結尾顯示2個額外(空白)元素(不能使用PREG_SPLIT_NO_EMPTY,因為isbn可以為空)。

2)是否可以從中獲取關聯數組? 我的意思是我希望以這種格式輸出$ output = array(“title”=>“Book1”,“writer”=>“writer1”,“isbn”=>“1234”)的形式。

$val = "[title]Book1[/title][writer]Writer1[/writer][isbn]1234[/isbn]";
$pattern = '/\[title](.*?)\[\/title].*?\[writer](.*?)\[\/writer].*?\[isbn](.*?)\[\/isbn]/i';
$allparams = preg_split($pattern, $val, -1, PREG_SPLIT_DELIM_CAPTURE);

輸出:

Array ( [0] => [1] => Book1 [2] => Writer1 [3] => 1234 [4] => )

preg_split是不是要走的路,使用preg_match (或preg_match_all如果你想從一個字符串幾個結果):

$pattern = '~
    \[title]  (?<title>  [^[]+ ) \[/title]  .*?
    \[writer] (?<writer> [^[]+ ) \[/writer] .*?
    \[isbn]   (?<isbn>   [^[]+ ) \[/isbn]
~sx';

if (preg_match($pattern, $yourtext, $m)) {
    echo 'title:  ' . $m['title']  . PHP_EOL
       . 'writer: ' . $m['writer'] . PHP_EOL
       . 'isbn:   ' . $m['isbn']   . PHP_EOL;
}

s標志允許點匹配換行符, x標志忽略模式中的空格。

請注意,您可以像PHP 5.6一樣過濾數字鍵(未經測試):

$result = array_filter($m, function ($k) { return !is_numeric($k); }, ARRAY_FILTER_USE_KEY);

如果你沒有PHP> = 5.6,一個簡單的foreach循環可以完成這項工作:

$result = array();
foreach ($m as $k=>$v) {
    if (is_numeric($k) || empty($v)) continue;
    $result[$k] = $v;
}

類似的東西會起作用,即使這不是我想的最好的方式......

$a = "/\[(.*)\](.*)\[\/.*\]/U";
$val = "[title]Book1[/title][writer]Writer1[/writer][isbn]1234[/isbn]";
$array = json_decode('{'.substr(preg_replace($a, ',"$1":"$2"', $val), 1).'}');

順便說一句,這個找到每個[TAG]並將其放入數組中(無論你使用多少個標簽)。 要小心,因為它使用JSON,它可能有一些問題"或意外的字符串不在[tag]string[/tag]模式中。

暫無
暫無

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

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