将表达式结果与变量匹配

时间:2016-05-26 19:11:37

标签: php regex string

如何将模式字符串与{{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",
];

有没有办法构建一个函数,将patternstring作为变量传递并实现result

谢谢!

2 个答案:

答案 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