[英]PHP splitting a string
所以我有以下字符串:
{family:Open Sans,name:Open Sans,import_family:Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic,classname:opensans}
我想對其進行“向量化”,所以也許看起來像這樣:
XX['family'] = "Open Sans',
XX['name'] = 'Open Sans',
XX['import_family'] = 'Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic',
XX['classname'] = 'opensans';
關於如何在PHP中實現此目標的任何想法? 這讓我感到不安,在過去的兩個小時里一直試圖用正則表達式解決這個問題,但到目前為止沒有任何結果。
提前致謝!
這是您可以使用的這種格式的簡單解析器。 它將處理所有字段和值,並將它們作為鍵/值數組返回。 假定字符串以大括號開頭和結尾,並使用field:optional:optional,a,b,c
格式。
<?php
header('Content-Type: text/plain');
function parse($str) {
$obj = [];
$str = substr($str, 1, -1);
$candidates = explode(',', $str);
$lastKey = null;
foreach ($candidates as $candidate) {
if (strpos($candidate, ':')) {
$parts = explode(':', $candidate);
$key = $parts[0];
$value = substr($candidate, strlen($key) + 1);
$obj[$key] = $value;
$lastKey = $key;
} else {
$obj[$lastKey] .= ',' . $candidate;
}
}
return $obj;
}
$example = '{family:Open Sans,name:Open Sans,import_family:Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic,classname:opensans}';
print_r(parse($example));
?>
您指定的示例字符串的輸出:
Array
(
[family] => Open Sans
[name] => Open Sans
[import_family] => Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic
[classname] => opensans
)
嘗試這個:
$s = "{family:Open Sans,name:Open Sans,import_family:Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic,classname:opensans}";
$s = rtrim(ltrim($s, '{'), '}');
preg_match_all('#([^:,]+):((?:(?!(,[^:,]+:)).)*)#', $s, $matches);
$vector = array_combine($matches[1], $matches[2]);
編輯
([^:,]+):(.+?)(?=,[^,]+:|$)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.