3

PHPのpreg_replaceを使用していて、文字列を変換しようとしています

abcd

の中へ

(a(b(c(d))))

これは私が持っている最高のものです:

preg_replace('/.(?=(.*$))/', '$0($1)', 'abcd');
// a(bcd)b(cd)c(d)d()

正規表現でも可能ですか?

編集PCRE仕様でこれを発見したばかりReplacements are not subject to re-matchingなので、元のアプローチは機能しません。私の実際のユースケースにはもっと複雑なマッチングロジックがあるので、すべての正規表現を維持したかったのです。

4

4 に答える 4

6

どうですか:

preg_replace('/./s', '($0', 'abcd') . str_repeat(')', strlen('abcd'));

?

(それは「正規表現を使用」と見なされますか?)

于 2012-09-28T21:13:06.873 に答える
1

preg_match_all を使用できます。ただし、どのようなキャラクターが必要かはわかりません。したがって、すべての文字の例を示します。

$val = 'abcd1234';
$out = '';

if(preg_match_all('#.#', $val, $matches))
{
    $i = 0; // we'll use this to keep track of how many open paranthesis' we have
    foreach($matches[0] as &$v)
    {
        $out .= '('.$v;
        $i++;
    }
    $out .= str_repeat(")", $i);
}
else
{
    // no matches found or error occured
}

echo $out; // (a(b(c(d(1(2(3(4))))))))

さらにカスタマイズするのも簡単です。

于 2012-09-28T21:18:18.593 に答える
0

これが私のやり方です=):

<?php
$arr = str_split("abcd");
$new_arr =  array_reverse($arr);

foreach ($new_arr as $a) {
    $str = sprintf('(%s%s)', $a, $str);
}
echo "$str\n";

?>

KISSですね。(数行: 6)

于 2012-09-28T21:24:16.983 に答える
0

上記の回答の組み合わせに沿って何かを行いました:

preg_match_all('/./ui', 'abcd', $matches);
$matches = $matches[0];
$string = '('.implode('(', $matches).str_repeat(')', count($matches));
于 2012-09-28T21:24:24.543 に答える