按模板占位符在字符串中查找字符串

时间:2015-11-26 14:03:05

标签: php arrays string find

我正在寻找可以找到该字符串中与我的模板匹配的任何字符串部分的函数。

例如:

$string = "I found this function in 2015/03/01";
$template = "XXXX/XX/XX";
$go_search = find_string_by_template($template,$string);
echo $go_search;

结果:2015/03/01

2 个答案:

答案 0 :(得分:1)

真的很简单..它可能要复杂得多......

$string = "I found this function in 2015/03/01";
preg_match("/(\d{4}\/\d{2}\/\d{2})/", $string, $dates);
var_dump($dates);

答案 1 :(得分:0)

简单通用的解决方案:

function template_pattern($tpl)
{
   $pattern = '';
   $l = strlen($tpl);
   for($i=0; $i<$l; $i++)
   {
      $pattern .= 'D' === $tpl[$i] ? '\\d' : ('W' === $tpl[$i] ? '\\w' : preg_quote($tpl[$i],'/'));
   }
   return '/(' . $pattern . ')/';
}

使用示例: D匹配一位数字符,W匹配一个字母数字字符,其余字符为正则表达式转义

注意可以使用更多选项扩充template_pattern函数(例如,匹配频繁的模式,如特定的日期格式,文件格式等,但它有利于开始)< / p>

preg_match(template_pattern("DDDD/DD/DD"), "I found this function in 2015/03/01", $matches);
print_r($matches);

输出:

Array
(
    [0] => 2015/03/01
    [1] => 2015/03/01
)

如果你想匹配并捕获整个字符串并将模板作为一个组提取,你可以做一个变化:

function template_pattern2($tpl)
{
   $pattern = '';
   $l = strlen($tpl);
   for($i=0; $i<$l; $i++)
   {
      $pattern .= 'D' === $tpl[$i] ? '\\d' : ('W' === $tpl[$i] ? '\\w' : preg_quote($tpl[$i],'/'));
   }
   return '/.*?(' . $pattern . ').*?/';
}


preg_match(template_pattern2("DDDD/DD/DD"), "I found this function in 2015/03/01", $matches);
print_r($matches);

输出:

Array
(
    [0] => I found this function in 2015/03/01
    [1] => 2015/03/01
)