vsprintf を使用する関数のカスタム形式をユーザーが指定できるようにする必要があります。PHP には glibc の register_printf_function() がないため、PCRE で指定する必要があります。
私の質問は、 % の後に任意の文字が続き、その前に % がなくても、後でプログラムで使用できるようにするのに最適な REGEXP は何でしょうか?
私が得ることができる最も近い解決策は次のとおりです。
<?php
function myprintf($format,$args) {
$matches = array();
preg_match_all('/((?<!%)%*[^%]+)/', $format,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
print_r($matches);
}
myprintf("begin%a%%b%%%c%d",NULL);
どちらがうまくいきますが、これは「%%%c」のような入力によって「混乱」します。次のように、一連の 2 つの % 記号 (つまり、エスケープ) を 1 つのグループにまとめたいと思います。
Array (
0 => '%%',
1 => '%c'
)
Array ( 0 => '%%%c' ) つまり、カスタム printf の処理を行った後にピースを結合するために、トークン化されていても、入力をそのままにしておく必要があります。入力で遭遇するフォーマット。
ありがとう、
フラウィウス
PS: 「ユーザー」は実際には別のプログラマーです。私はセキュリティへの影響を認識しています。