У меня есть простая функция PHP для тестирования:
<?php
function MyOwnFunction($CaseType, $HashType, $OrgStr) {
if ($CaseType == 'u') {
$NewStr = strtoupper($OrgStr);
}
if ($CaseType == 'l') {
$NewStr = strtolower($OrgStr);
}
if ($HashType == 'md5') {
$OutStr = md5($NewStr);
}
if ($HashType == 'sha1') {
$OutStr = sha1($NewStr);
}
return $OutStr;
}
?>
Все данные являются общими.
У меня есть этот простой текстовый блок:
[/a_1]Lorem ipsum dolor sit amet, consectetur adipiscing elit.[a_1/]
Phasellus et commodo ligula.
[/b_2]Nulla finibus posuere nisl, ut ultrices dolor.[b_2/]
[/c_3]Fusce dignissim tincidunt dui id imperdiet.[c_3/]
Donec venenatis ipsum lacus, sit amet posuere enim gravida et.
---
[a_1] = u : md5.
[c_3] = l : sha1.
Я называю этот текстовый блок как var varible: $MyTextBlock
.
Теперь я хочу создать новую функцию PHP: NewTestFunction
, которая анализирует $MyTextBlock
. Выходной текст, эквивалентный запуску MyOwnFunction('u', 'md5', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.');
и MyOwnFunction('l', 'sha1', 'Fusce dignissim tincidunt dui id imperdiet.');
, И, рев - это возвращенный текст, который я хочу иметь:
958bbb39b883fb80e852db91d15a80ca
Phasellus et commodo ligula.
[/b_2]Nulla finibus posuere nisl, ut ultrices dolor.[b_2/]
f98503d5c5cc6355895e049f5b0676d54588a6d6
Donec venenatis ipsum lacus, sit amet posuere enim gravida et.
---
[a_1] = u : md5.
[c_3] = l : sha1.
Как анализировать этот текстовый блок как параметры функции, в PHP? Есть ли какие-нибудь предложения для меня?
Этот вопрос не дублируется с любым доступным вопросом: мой вопрос о регулярном выражении; и другой вопрос о равных.
Способ сделать что-то вроде использования preg_replace_callback
, например:
// you need first to split the text at the last ---
$parts = preg_split('~\A(?>.*\K\R)*---\R\s*~', $text);
// if the split succeeds:
if (isset($parts[1])) {
list($text, $table) = $parts;
$tablePtn = '~^\[(?<tag>[^]]*)] = (?<case>[ul]) : (?<hash>sha1|md5)\.$~m';
if (preg_match_all($tablePtn, $table, $matches, PREG_SET_ORDER)) {
$corr = [];
foreach ($matches as $m)
$corr[$m['tag']] = ['case' => $m['case'], 'hash' => $m['hash']];
// build a pattern with known tags
$textPtn = '~\[/(?<tag>' . implode('|', array_keys($corr)) . ')]'
. '(?<content> [^[]*+ (?:\[(?!\g<tag>/]|/\g<tag>])[^[]*)*+ )'
. '\[\g{tag}/]~x';
// the do...while($count) approach allows to deal with nested tags
// Note that the pattern is build to match the innermost tag
do {
$text = preg_replace_callback($textPtn, function ($m) use ($corr) {
$trans = $corr[$m['tag']];
if ($trans['case'] == 'u')
$res = strtoupper($m['content']);
elseif ($trans['case'] == 'l')
$res = strtolower($m['content']);
if ($trans['hash'] == 'md5')
$res = md5($res);
elseif ($trans['hash'] == 'sha1')
$res = sha1($res);
return $res;
}, $text, -1, $count);
} while ($count);
}
}
echo $text;