php正则表达式删除文本

时间:2012-03-11 14:45:22

标签: php regex preg-replace

如果我有一个表格的字符串:

$text='remove1  (keep1) remove2 (keep2) remove3';

使用回复

https://stackoverflow.com/a/5293343/1154853

$re = '/[^()]*+(\((?:[^()]++|(?1))*\))[^()]*+/';
$text = preg_replace($re, '$1', $text);

我得到了

(keep1)(keep2)

如果我想从

开始
$text='remove1  {keep1} remove2 {keep2} remove3';

{keep1}{keep2}

我想更改分隔符,如何更改给定的正则表达式?我尝试了各种各样的改变组合(但{我无法让它发挥作用。我发现这些reg exp很难!

3 个答案:

答案 0 :(得分:1)

你需要转义大括号:

$re = '/[^()]*+(\((?:[^()]++|(?1))*\))[^()]*+/';
          ^^     ^     ^^           ^   ^^
                 Esc                Esc

标记是分隔符的位置,只有两个需要使用斜杠进行转义。我相信这会奏效:

$re = '/[^{}]*+(\{(?:[^{}]++|(?1))*\})[^{}]*+/';

答案 1 :(得分:0)

对于括号(),您可以使用:

$re = '/(?:^|(?<=\)))[^(]+/';
$text = preg_replace($re, '', $text);

编辑对于大括号{},请使用以下变体:

$re = '/(?:^|(?<=\}))[^{]+/';
$text = preg_replace($re, '', $text);

请注意,对于嵌套结构,这些将失败 - 正如所有正则表达式所做的那样。

解释

(?:        # non-capturing group start
  ^        #   start-of-string
  |        #   or...
  (?<=\})  #   look-behind: a position preceded by a } closing brace
)          # end non-capturing group
[^{]+      # any character except an opening brace, multiple times

非捕获组将匹配的开始位置在右大括号后面或字符串的开头处。 [^{]+匹配每个字符直到下一个括号。实际上,这匹配{words}之间的所有内容。

请参阅:http://rubular.com/r/1Sp72TbHIi

编辑#2 当然,思考不那么复杂,这也有用:

$re = '/((?:\\\w+)?\{[^}]*\})/';
$text = preg_replace($re, '$1', $text);

http://rubular.com/r/rPLMbCLbcq

答案 2 :(得分:0)

试试这个:

$re = '/[^{}]*+(\{(?:[^{}]++|(?1))*\})[^{}]*+/';
$text = preg_replace($re, '$1', $text);