在PHP中没有正则表达式的格式化字符串

时间:2016-11-17 13:35:34

标签: php regex string-formatting

如何根据灵活模式格式化任意字符串?我想出的唯一解决方案是使用正则表达式,但后来我需要2"模式" (一个用于搜索,一个用于输出)。

示例:

WPF

期望的输出:12.3AB-C5-67.8

我想在变量中使用一个模式(一个用户可以在不知道正则表达式的情况下轻松定义的模式)它可能如下所示:

$str = '123ABC5678"; 

因此用户只需使用2个不同的字符(%和。)

带有正则表达式的解决方案如下所示:

$pattern = '%%.%%%-%%-%%.%';

方式过于复杂,因为用户需要定义$ pattern_src和$ pattern_rpl。如果字符串的长度不同,则解释起来会更复杂。

是的,我可以编写一个函数/解析器,根据像%%。%%% - %% - %%。%这样的简单用户模式构建所需的正则表达式。但我想知道是否有任何"内置"用PHP实现这个目的的方法?我正在考虑sprintf等,但这似乎并没有成功。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

为什么不编写一个如下工作的简单解析器:

对于每个模式的字符:

  • 如果匹配百分比字符,则从输入
  • 输出下一个字符
  • 如果您匹配任何其他角色,请将其输出
$str = '123ABC5678';
$pattern = '%%.%%%-%%-%%.%';

if (strlen($str) < substr_count($pattern, '%'))
  Die('The length of input string is lower than number number of placeholders');
$len = strlen($pattern);
$stringIndex = 0;
$output = '';
for ($i = 0; $i < $len; $i++) {
  if ($pattern[$i] === '%') {
    $output .= $str[$stringIndex];
    $stringIndex++;
  } else {
    $output .= $pattern[$i];
  }
}
echo $output;

答案 1 :(得分:2)

我有一个类似的解决方案。

<?php
$format = '%%.%%%-%%-%%.%';
$string = '123ABC5678';

$new_string = '';
$c = 0;
for( $i = 0; $i < strlen( $format ); $i++ )
{
  if( $format[ $i ] == '%' )
  {
    $new_string .= $string[ $c ];
    $c++;
  }
  else
  {
    $new_string .= $format[ $i ];
  }
}

echo $new_string;

输出:

12.3AB-C5-67.8

答案 2 :(得分:2)

用户的这种模式怎么样?

2.3-2-2.1
如果模式是数字表示n个字符,则点或短划线表示添加点或短划线。

现在你创建一个正则表达式来解析用户输入:

preg_match_all("/(.)/", $User_input, $pattern);

现在你将拥有一个带有数字或点和短划线的数组。

因此循环遍历数组并构建字符串:

$string = '123ABC5678';
$User_input = "2.3-2-2.1";

preg_match_all("/(.)/", $User_input, $pattern);

$i=0;
$str="";
foreach($pattern[1] as $val){

    if(is_numeric($val)){
        $str .= substr($string,$i,$val);
        $i=$i+$val;
    }else{
        $str .= $val;
    }

}


 echo $str;

https://3v4l.org/5eg5G

答案 3 :(得分:1)

  

我在考虑sprintf等,但这似乎没有做到这一点。

你走在正确的轨道上。您可以使用vsprintf完成此操作,如下所示:

$str = '123ABC5678';
$pattern = '%%.%%%-%%-%%.%';
echo vsprintf(str_replace('%', '%s', $pattern), str_split($str));

<强>输出:

12.3AB-C5-67.8

这假设%$pattern个字符的数量与$str的长度相匹配。