我已经尝试了一些关于&#34的解决方案;替换字符串中的第二次出现" (比如here)但无法解决我的问题。
字符串示例:
$string = "$$ f'(x) = 12x^2 + 4x $$ $$ f'(x) = 12x+2x-12 $$ $$ f'(x) = 12x^3 +4x^2 $$";
目标:
$string = "\( f'(x) = 12x^2 + 4x \) \( f'(x) = 12x+2x-12 \) \( f'(x) = 12x^3 +4x^2 \)";
我发现了gist snippet:
function str_replace_n($search, $replace, $subject, $occurrence)
{
$search = preg_quote($search);
return preg_replace("/^((?:(?:.*?$search){".--$occurrence."}.*?))$search/", "$1$replace", $subject);
}
并尝试通过以下方式在第二个实例上小心地调用它:
$string = str_replace_n('$$', '\)', $string, 2);
然后我可以检查剩下的$$
并将其替换为\(
。
但是,当我这样称呼它时,该功能无效。
我认为这是一个转义问题,因为$$
是rexeg运算符,但即使转义它们也没有改变结果(函数中的preg_quote应该做出魔术,我假设):$string = str_replace_n('\$\$', '\\)', $string, 2);
- 不... ...
我做错了什么?
答案 0 :(得分:1)
您可以使用此正则表达式进行搜索:
\$\$((?:(?!\$\$).)*)\$\$
并替换使用:
\\($1\\)
前瞻表达式(?:(?!\$\$).)
匹配任何不是$$
<强>代码:强>
$re = '/\$\$((?:(?!\$\$).)*)\$\$/';
$str = '$$ f\'(x) = 12x^2 + 4x $$ $$ f\'(x) = 12x+2x-12 $$ $$ f\'(x) = 12x^3 +4x^2 $$';
$subst = '\\\\($1\\\\)';
$result = preg_replace($re, $subst, $str);
正如@Wiktor在下面建议的那样,一个简单的非贪婪正则表达式模式也适用于此:
\$\$(.*?)\$\$
答案 1 :(得分:0)
正则表达式:\${2}([^$]+)\${2}
或\${2}(.+?)\${2}
替换:($1)
详细说明:
{n}
完全匹配n
次[^]
匹配列表中不存在的单个字符+
匹配一次且无限次PHP代码:
$string = "$$ f'(x) = 12x^2 + 4x $$ $$ f'(x) = 12x+2x-12 $$ $$ f'(x) = 12x^3 +4x^2 $$";
$string = preg_replace('~\${2}([^$]+)\${2}~', '($1)', $string);
print_r($string);
输出:
( f'(x) = 12x^2 + 4x ) ( f'(x) = 12x+2x-12 ) ( f'(x) = 12x^3 +4x^2 )