2

我正在尝试删除 MathJax 分隔符之间包含的所有文本,例如$str1 = blah blah \( 2*(2+2) = 8\) blah blah \[ \int_0^1 f = [F]_0^1 \].

正如您可能已经想到的那样,分隔符是\(...\)and\[...\]并且该...部分可能包含任何字符()[]\

仅考虑这种\[...\]情况,我已经尝试过

$text = preg_replace("/\\\[.*\\\]/","",$text);

但由于某种原因它与我的表达不匹配,而

$text = preg_replace("/.\[.*\\\]/","",$text);

确实符合我的表达方式(但也有一些不需要的表达方式,比如a[...\].

所以我的问题有两个:

  1. 有什么问题\\\[
  2. 我可以做一些比中间的 .* 更好的事情,它会说“可以有 a\或 a ],但是没有\]

提前致谢!

4

2 回答 2

3
  1. 你必须使用

    preg_replace("/\\\\\\[.*\\\\\\]/", "", $str1);

    函数的模式参数preg_replace是一个普通的 PHP 字符串,因此\\被替换\为以下正则表达式模式:

    /\\\[.*\\\]/

    前两个反斜杠\\匹配主题中的一个反斜杠,其余的\[分别\]匹配[]

  2. 是的,您可以使用所谓的负前瞻零宽度断言。有关详细信息,请查看 http://www.regular-expressions.info/lookaround.html。在你的情况下,我会尝试类似:

    preg_replace("/\\\\\\[(?:(?!\\\\\\]).)*\\\\\\]/","",$str1);

    ?!\\\\\\]一旦\]遇到就停止匹配。?:防止外部括号被捕获。

于 2013-03-25T20:36:05.527 回答
1

这是一个匹配任一分隔符的正则表达式:

preg_replace('/\\[\[\(].*?\\[\]\)]/', '', $data); 
于 2013-03-25T20:34:37.253 回答