我想标记格式化字符串(非常类似于printf),我想我只是遗漏了一点点:
>%[number] [一个字母ctYymd]将成为一个标记²
> 1美元…… 10美元将成为一个代币
>所有其他(普通文本)成为一个标记.
²update:现在使用#而不是%. (使用Windows命令行参数减少麻烦)
如果你专注于通过管道连接的三个部分(作为 – 或者),这并不可怕,所以基本上它只是三个匹配.因为我想从头到尾匹配,所以我把东西包裹在/^…%/中并被一个不匹配的组包围(?:……可能会重复一次或多次:
$exp = '/^(?:(%\\d*[ctYymd]+)|([^$%]+)|(\\$\\d))+$/';
我的来源仍未提供:
$exp = '/^(?:(%\\d*[ctYymd]+)|([^$%]+)|(\\$\\d))+$/';
echo "expression: $exp \n";
$tests = [
'###%04d_Ball0n%02d$1',
'%03d_Ball0n%02x$1%03d_Ball0n%02d$1',
'%3d_Ball0n%02d',
];
foreach ( $tests as $test )
{
echo "teststring: $test\n";
if( preg_match( $exp, $test, $tokens) )
{
array_shift($tokens);
foreach ( $tokens as $token )
echo "\t\t'$token'\n";
}
else
echo "not valid.";
} // foreach
我得到的结果却是:比赛失灵了.第一个%[数字] [字母]从不匹配,因此其他匹配双:
expression: /^((%\d*[ctYymd]+)|([^$%]+)|(\$\d))+$/
teststring: ###%04d_Ball0n%02d$1
'$1'
'%02d'
'_Ball0n'
'$1'
teststring: %03d_Ball0n%02x$1%03d_Ball0n%02d$1
not valid.teststring: %3d_Ball0n%02d
'%02d'
'%02d'
'_Ball0n'
teststring: %d_foobardoo
'_foobardoo'
'%d'
'_foobardoo'
teststring: Ball0n%02dHamburg%d
'%d'
'%d'
'Hamburg'