我想搜索在<
之类的美元符号之间的小于号$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)
但我不确定这是否是一个好的解决方案。我是编程的新手:)
感谢您的帮助。
答案 0 :(得分:2)
答案 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)。