ant*_*les 1 php regex string-formatting
如何根据灵活的模式格式化任意字符串?我想出的唯一解决方案是使用正则表达式,但是我需要 2 个“模式”(一种用于搜索,一种用于输出)。
例子:
$str = '123ABC5678"; 
所需输出:12.3AB-C5-67.8
我想在变量中使用一种模式(用户无需了解正则表达式即可轻松定义的模式)它可能如下所示:
$pattern = '%%.%%%-%%-%%.%';
因此用户只需使用 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
太复杂了,因为用户需要定义 $pattern_src 和 $pattern_rpl。如果字符串的长度可以变化,那么解释起来就会更加复杂。
是的,我可以编写一个函数/解析器,根据简单的用户模式(如 %%.%%%-%%-%%.%)构建所需的正则表达式。但我想知道是否有任何“内置”方法可以用 php 实现这一点?我正在考虑 sprintf 等,但这似乎不起作用。有任何想法吗?
我正在考虑 sprintf 等,但这似乎不起作用。
你走在正确的轨道上。您可以通过vsprintf以下方式完成此操作:
$str = '123ABC5678';
$pattern = '%%.%%%-%%-%%.%';
echo vsprintf(str_replace('%', '%s', $pattern), str_split($str));
输出:
12.3AB-C5-67.8
%这是假设 中的字符数与$pattern的长度匹配$str。