在php中根据模式格式化字符串而不使用正则表达式

ant*_*les 1 php regex string-formatting

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

例子:

$str = '123ABC5678"; 
Run Code Online (Sandbox Code Playgroud)

所需输出:12.3AB-C5-67.8

我想在变量中使用一种模式(用户无需了解正则表达式即可轻松定义的模式)它可能如下所示:

$pattern = '%%.%%%-%%-%%.%';
Run Code Online (Sandbox Code Playgroud)

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

使用正则表达式的解决方案如下所示:

$str = '123ABC5678';
$pattern_src = '@(.{2})(.{3})(.{2})(.{2})(.{1})@';
$pattern_rpl = "$1.$2-$3-$4.$5";

$res = preg_replace($pattern_src, $pattern_rpl, $str);
//$res eq 12.3AB-C5-67.8
Run Code Online (Sandbox Code Playgroud)

太复杂了,因为用户需要定义 $pattern_src 和 $pattern_rpl。如果字符串的长度可以变化,那么解释起来就会更加复杂。

是的,我可以编写一个函数/解析器,根据简单的用户模式(如 %%.%%%-%%-%%.%)构建所需的正则表达式。但我想知道是否有任何“内置”方法可以用 php 实现这一点?我正在考虑 sprintf 等,但这似乎不起作用。有任何想法吗?

mis*_*tin 7

我正在考虑 sprintf 等,但这似乎不起作用。

你走在正确的轨道上。您可以通过vsprintf以下方式完成此操作:

$str = '123ABC5678';
$pattern = '%%.%%%-%%-%%.%';
echo vsprintf(str_replace('%', '%s', $pattern), str_split($str));
Run Code Online (Sandbox Code Playgroud)

输出:

12.3AB-C5-67.8

%这是假设 中的字符数与$pattern的长度匹配$str