我正在使用PHP的 preg_replace 函数,尝试将字符串
abcd
转换为
(a(b(c(d))))
以下是我能够得到的最佳结果:
preg_replace('/.(?=(.*$))/', '$0($1)', 'abcd');
// a(bcd)b(cd)c(d)d()
使用正则表达式可以实现吗?
编辑:我刚刚在 PCRE 规范中发现了这个问题:替换不受重新匹配的影响,因此我的原始方法行不通。 我想保持所有的正则表达式,因为在我的实际用例中有一些更复杂的匹配逻辑。
我正在使用PHP的 preg_replace 函数,尝试将字符串
abcd
转换为
(a(b(c(d))))
以下是我能够得到的最佳结果:
preg_replace('/.(?=(.*$))/', '$0($1)', 'abcd');
// a(bcd)b(cd)c(d)d()
使用正则表达式可以实现吗?
编辑:我刚刚在 PCRE 规范中发现了这个问题:替换不受重新匹配的影响,因此我的原始方法行不通。 我想保持所有的正则表达式,因为在我的实际用例中有一些更复杂的匹配逻辑。
preg_replace('/./s', '($0', 'abcd') . str_repeat(')', strlen('abcd'));
这算不算“使用正则表达式”?
您可以使用 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))))))))
这也很容易进一步定制。
$array2 = $array仍然会复制数组,这就是为什么我觉得每当我想要指定变量确实是指针而不是新值时,使用&更自然。如果PHP再次从头设计,我相信这将成为标准,因为&有时是必要的,有时不是,这对于编程语言来说有点模糊。 - Dejiunset($v);。否则,在foreach之后使用变量$v = '123';时,很快就会出现错误,并且这将更新数组中的最后一条记录。 - Glavić这是我的做法 =) :
<?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)
我选择了以上答案的组合:
preg_match_all('/./ui', 'abcd', $matches);
$matches = $matches[0];
$string = '('.implode('(', $matches).str_repeat(')', count($matches));