gpt4 book ai didi

php - 替换文字星号 (*) ... 但仅在括​​号内

转载 作者:行者123 更新时间:2023-12-03 18:58:22 28 4
gpt4 key购买 nike

这是我的下一个正则表达式问题。老实说,我想为数学乘法制作动画,当他们输入一些公式时,他们会得到动画来描述这个数字在哪里计数,这是我的代码的这一部分。

$pattern = '([*])';
$replace = '||';
$stringAsli = (123*1.23*(0.12/8))*(123*512+40);
$replaceResult= str_replace($pattern,$replace,$stringAsli);

但我得到了结果:

(123||1.23||(0.12/8))||(123||512+40)

我想要这样的结果

(123||1.23||(0.12/8))*(123||512+40);

扩展要求

在这种带有引号字符串的特殊情况下:

("123*1.23*n"*"(0.12/8)")*("123*512"+40)

应该变成

("123||1.23||n"$"(0.12/8)")*("123||512"+40)

换句话说,仍然替换方括号内的*,但是如果我们在引号内的字符串我们替换为||,如果不是我们替换为$

最佳答案

递归正则表达式和 Lambda 替换

为了安全地进入括号,我们需要使用递归正则表达式。幸运的是,PHP 支持这一点。这样做(参见在线演示的输出):

$mystring = "(123*1.23*(0.12/8))*(123*512+40)";
$nested_parentheses_regex="~\((?:[^()]++|(?R))*\)~";
$replaced = preg_replace_callback(
$nested_parentheses_regex,
function($m) { return str_replace("*","||",$m[0]);},
$mystring
);
echo $replaced;

查看 the online demo 的输出.

解释

  • 递归正则表达式 \((?:[^()]++|(?R))*\) 匹配(可能)嵌套的括号
  • preg_replace_callback 函数调用一个匿名函数,该函数将匹配中的每个 * 替换为 ||(这是一组嵌套括号.

扩展要求

你现在要求在括号内,当星号不在引号内时,我们返回 $

使用这个:

$mystring = '("123*1.23*n"*"(0.12/8)")*("123*512"+40)';
$nested_parentheses_regex ="~\((?:[^()]++|(?R))*\)~";

$replaced = preg_replace_callback($nested_parentheses_regex,
function($m) {
return preg_replace_callback(
'~"[^"]*"|(\*)~', // complete "quote" OR capture * to Group 1
function($n) {
// Not inside quotes?
if(isset($n[1])) return "\$";
else { // we matched a "full quote"
return str_replace("*","||",$n[0]);
}
},
$m[0] // this is a (full (set) of parentheses)
); // end inner callback
},
$mystring
); // end outer callback
echo $replaced;

关于php - 替换文字星号 (*) ... 但仅在括​​号内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24856813/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com