Preg_match每边包含几个特殊字符的字符串


preg_match string between several special characters on each side

我试图摆脱包含在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. 我能做一些比中间的。*更好的东西吗?它会说"有']是可以的,但没有'] ?

提前感谢!

  1. 你必须使用

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

    preg_replace函数的模式参数是一个普通的PHP字符串,因此'''替换以产生以下regex模式:

    /'''[.*''']/

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

  2. 是的,你可以,使用所谓的负向前看零宽度断言。详情请浏览http://www.regular-expressions.info/lookaround.html。在您的情况下,我会尝试这样做:

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

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

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

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