删除[] {}括号之外的文本

问题描述

我有一个字符串,我想从中将文本保留在一对方括号内,并删除括号之外的所有内容

你好[123] {45}世界(67)
你好,那里(8)[9] {0}

所需的输出
[123] {45}(67)(8)[9] {0}

代码已尝试但失败了:

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

解决方法

如果字符串中的值始终是一个右括号与一个右括号配对且没有嵌套部分,则可以匹配所有要保留的括号对,并匹配除想要保留的括号之外的所有其他字符删除。

(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|[^][(){}]+

说明

Regex demo | Php demo

示例代码

$re = '/(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|[^][(){}]+/m';
$str = 'Hello [123] {45} world (67)
Hello There (8) [9] {0}';

$result = preg_replace($re,'',$str);

echo $result;

输出

[123]{45}(67)(8)[9]{0}

如果要删除所有其他值:

(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|.

Regex demo

,

看起来您也想定位嵌套的内容。已经有questions关于如何匹配平衡括号的信息。调整其中一种模式以适合您的需求,例如像

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

您可以try this on Regex101。提取那些with preg_match_all and implode the matches

if(preg_match_all($pattern,$str,$out) > 0)
  echo implode(' ',$out[0]);

如果您需要匹配外部内容,即使采用这种模式,您也可以使用也使用@Thefourthbird (*SKIP)(*F)in his elaborately answer!用于跳过方括号see this other demo

,

如果方括号未嵌套,则满足以下条件:

          <tbody>
          <tr>
              <th>Return ID</th>
              <th>ZD Ticket</th>
              <th>Return Status</th>
              <th>Customer Email</th>
          </tr>
          <tr>
              <?php 
              foreach($returnsTable as $item){
                  echo "<td>".$item."</td>";
              }
              ?>
          </tr>
          </tbody>
          </table>
      </div>

Demo

故障:

[^[{(\]})]+(?=[[{(]|$)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...