通过修改PHP中的字符串,将所有胶乳出现的$$ ... $$替换为内联\(... \)

时间:2018-02-06 11:01:28

标签: php regex string

我已经尝试了一些关于&#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); - 不... ...

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式进行搜索:

\$\$((?:(?!\$\$).)*)\$\$

并替换使用:

\\($1\\)

RegEx Demo

前瞻表达式(?:(?!\$\$).)匹配任何不是$$

的字符

<强>代码:

$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 )