我正在使用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
中发现了这一点,所以我的原始方法无效。我想保留所有正则表达式,因为在我的实际用例中有一些更复杂的匹配逻辑。
答案 0 :(得分:6)
怎么样:
preg_replace('/./s', '($0', 'abcd') . str_repeat(')', strlen('abcd'));
(这是否算作“正则表达式”?)
答案 1 :(得分: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))))))))
也可以轻松进一步定制。
答案 2 :(得分: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)
答案 3 :(得分:0)
我选择了上述答案的组合:
preg_match_all('/./ui', 'abcd', $matches);
$matches = $matches[0];
$string = '('.implode('(', $matches).str_repeat(')', count($matches));