如何根据灵活模式格式化任意字符串?我想出的唯一解决方案是使用正则表达式,但后来我需要2"模式" (一个用于搜索,一个用于输出)。
示例:
WPF
期望的输出:12.3AB-C5-67.8
我想在变量中使用一个模式(一个用户可以在不知道正则表达式的情况下轻松定义的模式)它可能如下所示:
$str = '123ABC5678";
因此用户只需使用2个不同的字符(%和。)
带有正则表达式的解决方案如下所示:
$pattern = '%%.%%%-%%-%%.%';
方式过于复杂,因为用户需要定义$ pattern_src和$ pattern_rpl。如果字符串的长度不同,则解释起来会更复杂。
是的,我可以编写一个函数/解析器,根据像%%。%%% - %% - %%。%这样的简单用户模式构建所需的正则表达式。但我想知道是否有任何"内置"用PHP实现这个目的的方法?我正在考虑sprintf等,但这似乎并没有成功。有什么想法吗?
答案 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;
答案 3 :(得分:1)
我在考虑sprintf等,但这似乎没有做到这一点。
你走在正确的轨道上。您可以使用vsprintf
完成此操作,如下所示:
$str = '123ABC5678';
$pattern = '%%.%%%-%%-%%.%';
echo vsprintf(str_replace('%', '%s', $pattern), str_split($str));
<强>输出:强>
12.3AB-C5-67.8
这假设%
中$pattern
个字符的数量与$str
的长度相匹配。