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";

?>

亲吻不是吗?(几行: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 回答