首页 > 解决方案 > php preg拆分数据

问题描述

我想按部分分割文本以及 === === 内部的部分名称所以数据就像

   ===A=== 
   a
   ===B=== 
   b
   ===C=== 
   c

preg split 就像:

  $sections = preg_split('/===([^=]+)===(?!=)/', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

但如果数据像

   ===A=== 
   a
   ====0==== 
   0
   ===B=== 
   b
   ===C=== 
   c

它出错了(我只需要用 3x === 将其拆分并忽略其他部分),这就是为什么后面会有负面的看法。

编辑:事实证明,问题是 split 从 ====0==== 获取了最后一个 === 并制作了新的假部分名称,直到第一个 === of ===B=== 所以它是由

 ====0==== 
   0
 ===B=== 

像这样的新假部分(删除括号中的内容)

 (====0=)===
 0
 ===(B===)

标签: phpregex

解决方案


这是使用 的一种方法prep_match_all,具有以下正则表达式模式:

(?!<=)={3,}[^=]+={3}(?!=).*?(?=[^=]={3}[^=]+={3}[^=]|$)

该模式表示匹配一个节标题,由三个定义,=中间有一些其他字符,然后是所有内容,直到到达另一个节标题整个输入的末尾。

$input = "===A=== 
          a
          ====0==== 
          0
          ===B=== 
          b
          ===C=== 
          c";
preg_match_all("/(?!<=)={3,}[^=]+={3}(?!=).*?(?=[^=]={3}[^=]+={3}[^=]|$)/s", $input, $sections);
print_r($sections[0]);

这打印:

Array
(
    [0] => ===A=== 
   a
   ====0==== 
   0

    [1] => ===B=== 
   b

    [2] => ===C=== 
   c
)

请注意,我们/s将 PHP 正则表达式模式中的修改用于 dot all 模式。这确保.*了模式中使用的 跨换行符匹配。


推荐阅读