如何将模式字符串与{{VARIABLE}}
定义的变量组从包含{{VARIABLE}}
的字符串匹配到数组?
示例:
我有模式字符串:
$pattern = "Image_{{DATE}}.{{EXTENSION}}";
我想传递匹配字符串
$string = "Image_2016-05-26.png";
将两个字符串传递给函数后,返回
$result = [
"DATE": "2016-05-26",
"EXTENSION": "png"
];
这包括但不限于示例变量:
$pattern = "Image_{{YEAR}}-{{MONTH}}-{{DAY}}.{{EXTENSION}}";
$string = "Image_2016-05-26.png";
// ------------------------------
$result = [
"YEAR" => "2016",
"MONTH" => "05",
"DAY" => "26",
"EXTENSION" => ".png"
];
(可选,我认为这是最难的)但是如果找到它们也只返回值:
$pattern = "Image_{{DATE}}.{{EXTENSION}}";
$string = "Image_2016-05-26";
// ------------------------------
$result = [
"DATE" => "2016-05-26",
];
有没有办法构建一个函数,将pattern
和string
作为变量传递并实现result
?
谢谢!
答案 0 :(得分:1)
以下是您需要执行的步骤的概述:
首先,除了{{
和}}
之外,转义所有对正则表达式有特殊含义的字符。接下来,将{{
的所有实例替换为(?P<
。接下来,将}}
的所有实例替换为>.*?)
。然后将/^
的前缀和$/
的后缀添加到字符串中。
这将转换以下模式:
Image_{{DATE}}.{{EXTENSION}}
进入以下正则表达式模式:
/^Image_(?P<DATE>.*?)\.(?P<EXTENSION>.*?)$/
现在,使用该正则表达式模式搜索匹配项。然后遍历匹配中所有捕获的组,并为每个组输出名称/值对。
例如,像这样的东西适用于这些例子:
function func_name($pattern, $string) {
$pattern = "/^" . str_replace([".", "{{", "}}"], ["\.", "(?P<", ">.*?)"], $pattern) . "$/";
preg_match($pattern, $string, $result);
return array_filter($result, "is_string", ARRAY_FILTER_USE_KEY);
}
当然,如果您的输入模式是正确的正则表达式模式,那么所有这些都会更容易......
至于使扩展变量可选,您可以通过在其后添加?
来使捕获组成为可选项,但根据您的示例,没有自动执行此操作的方法,因为在您的示例中,{扩展前的{1}}也是可选的,但输入模式中没有任何迹象表明是这种情况。换句话说,您需要将其转换为.
,但无法仅根据输入模式了解您需要在扩展程序周围添加/^Image_(?P<DATE>.*?)(?:\.(?P<EXTENSION>.*?))?$/
可选组,以及前一段时间。
答案 1 :(得分:0)
使用php strrt
函数
function func_name ($pattern, $params) {
$toReplace = [];
$res = array_walk($params, function($v, $k) use (&$toReplace) {
$toReplace['{{' . $k . '}}'] = $v;
});
return strtr($pattern, $toReplace);
}
$params = [
"YEAR" => "2016",
"MONTH" => "05",
"DAY" => "26",
"EXTENSION" => "png"
];
$pattern = "Image_{{YEAR}}-{{MONTH}}-{{DAY}}.{{EXTENSION}}";
echo func_name($pattern, $params); // Image_2016-05-26.png