带字符串的通用PHP匹配模板

时间:2011-01-20 22:39:46

标签: php templates string match

是否有一个允许我执行以下操作的功能:

$template = "{name}:{city}-{state}"
$string = "Tom:Some CityPlace-CA"

$out = function_I_am_looking_for($template,$string);

当$ out返回时

Array(
    [name] => Tom
    [city] => Some CityPlace
    [state] => CA
)

这样的功能是否存在?

--------编辑-----------

所以人们说话了,因为我不喜欢看到这样的事情,所以我会结束。没有内置函数,但是我做了一个模拟,它确实有效。请随意改进,请评论您的编辑。

function genaric_match($template,$string,$varStart="{{",$varEnd="}}"){


  $template = str_replace($varStart,"|~|`",$template);
  $template = str_replace($varEnd,"`|~|",$template);

  $t=explode("|~|",$template);

  $temp="";
  $i=0;
  foreach ($t as $n=>$v){
    $i++;
    if (($i==count($t)||($i==(count($t)-1)&&$t[$n+1]==""))&&substr($v,0,1)=="`"&&substr($v,-1)=="`"){
      //Last Item
      $temp.="(?P<".substr($v,1,-1).">.++)";

    }elseif(substr($v,0,1)=="`"&&substr($v,-1)=="`"){
      //Search Item
      $temp.="(?P<".substr($v,1,-1).">[^".$t[$n+1]."]++)";

    }else{
      $temp.=$v;
    }

  }
  $temp="~^".$temp."$~";

  preg_match($temp, $string, $matches);

  return $matches;

}

这个例子

print_r(genaric_match("{{name}}:{{city}}-{{state}}","Tom:Some CityPlace-CA"));

返回

Array
(
    [0] => Tom:Some CityPlace-CA
    [name] => Tom
    [1] => Tom
    [city] => Some CityPlace
    [2] => Some CityPlace
    [state] => CA
    [3] => CA
)

2 个答案:

答案 0 :(得分:3)

是的,它被称为preg_match。但你显然需要为它写一个正则表达式。 (如果你的问题是,是否存在魔术识别 - 任何模式 - 不知道 - 它的语法功能,那么答案是:否。)

preg_match('~^(?P<name>[^:]++):(?P<city>[^-]++)-(?P<state>.++)$~', $string, $matches);
var_dump($matches);

答案 1 :(得分:0)

PHP“开箱即用”中没有这样的功能,但写一个功能相当简单,因为有很多功能,例如......

...你可以用来创建一个。

然而,必须要说使用PHP(在很大程度上是一种模板语言)来创建另一种模板语言似乎是一个奇怪的选择。