preg_match每边的几个特殊字符之间的字符串

时间:2013-03-25 20:01:32

标签: php regex

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

正如您可能想到的那样,分隔符为\(...\)\[...\],而...部分可能包含任何字符()[]\

只考虑\[...\]案例,我试过这个

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

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

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

匹配我的表达式(但也有一些不需要的表达式,如a[...\]

所以我的问题是双重的:

  1. \\\[出了什么问题?
  2. 我可以做一些比中间更好的事情吗?*会说“可以\],但没有\]
  3. 提前致谢!

2 个答案:

答案 0 :(得分:3)

  1. 你必须使用

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

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

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

    前两个反斜杠\\匹配主题中的反斜杠,剩余的\[\]匹配[]

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

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

    ?!\\\\\\]遇到\]后立即停止匹配。 ?:阻止外部括号对被捕获。

答案 1 :(得分:1)

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

preg_replace('/\\[\[\(].*?\\[\]\)]/', '', $data);