替换$ x <y $ by =“”$ x =“”<=“”y $ =“”

时间:2016-07-28 14:14:21

标签: php regex

=“”

我想搜索在<之类的美元符号之间的小于号$x<y$的文字中,并将其替换为$x < y$

我正在使用mathjax而且less is sign会导致渲染Mathjax时遇到一些问题。(见这里:http://docs.mathjax.org/en/latest/tex.html#tex-and-latex-in-html-documents)。

我试过了 $text = preg_replace("/\$(.*?)(<)(.*?)\$/","/\$$1 < $3\$/",$text)但我不确定这是否是一个好的解决方案。我是编程的新手:)

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我编辑了我以前的答案 - 现在试试这个:

$text = preg_replace('/\$([^$< ]+)<([^$< ]+)\$/','$$1 < $2$', $text);

DEMO

答案 1 :(得分:2)

对于正则表达式而言,这太复杂了,我认为......

只要<符号之间有$的固定数量,就很容易(参见the answer from n-dru)。

但是你在这里:

$output = preg_replace(<<<'REGEX'
(\$\K\s*((?:[^<$\s]+|(?!\s+[<$])\s+)*)\s*(?=(?:<(*ACCEPT)|\$|$)(*SKIP)(*F))
# \$\K => avoid the leading $ in the match
# ((?:[^<$\s]+|(?!\s+[<$])\s+)*) => up to $ or <, excluding surrounding spaces
# (?=(?:<(*ACCEPT)|\$|$)(*SKIP)(*F)) => accept matches with <, reject these without
|(?!^)<\K\s*((?:[^<$\s]+|(?!\s+[<$])\s+)*)\s*(\$|)
# (?!^) => to ensure we are inside $ ... $
# <\K => avoid the leading < in the match
|[^$]+(*SKIP)(*F)
# skip everything outside $ ... $
)x
REGEX
, " $1$2 $3", $your_input);

另请参阅:https://regex101.com/r/fP9aG5/2

我知道,您要求$x<y<z$ =&gt; $x < y < z$(而不是$ x < y < z $),但这对于正常的替换模式是不可行的。需要preg_replace_callback

$output = preg_replace_callback(<<<'REGEX'
(\$\K\s*((?:[^<$\s]+|(?!\s+[<$])\s+)*)\s*(?=(?:<(*ACCEPT)|\$|$)(*SKIP)(*F))
|(?!^)<\K\s*((?:[^<$\s]+|(?!\s+[<$])\s+)*)\s*(\$|)
|[^$]+(*SKIP)(*F))x
REGEX
, function($m) {
    if ($m[1] != "") return "$m[1] ";
    if ($m[3] != "") return " $m[2]$m[3]";
    return " $m[2] ";
}, $your_input);

我尝试过$ your_input:

random < test
nope $ foo $ bar < a $ qux < biz $fx<hk$
$foo<bar<baz$ foo  buh < bar < baz $
$ foo $ a < z $ a < b < z $

使用这个preg_replace_callback,我得到了正如预期的那样:

random < test
nope $ foo $ bar < a $qux < biz$fx<hk$
$foo<bar<baz$foo  buh < bar < baz$
$ foo $ a < z $a < b < z$

答案 2 :(得分:0)

我尝试组装这个正则表达式。 如果它符合您的要求,请尝试使用它。

$text = preg_replace("/\\$(.{1,20})<(.{1,20})\\$/", "\$$1 < $2\$", $text);

在这个表达式中,你有{1,20},你可以用作参数,你可以在左右两侧使用max long(在本例中为20)。