Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php预分割数据_Php_Regex - Fatal编程技术网

php预分割数据

php预分割数据,php,regex,Php,Regex,我想将文本按节和===中的节的名称进行拆分,因此数据如下所示 ===A=== a ===B=== b ===C=== c preg split类似于: $sections = preg_split('/===([^=]+)===(?!=)/', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 但是如果数据是 ===A=== a ====0====

我想将文本按节和===中的节的名称进行拆分,因此数据如下所示

   ===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===)

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

(?!<=)={3,}[^=]+={3}(?!=).*?(?=[^=]={3}[^=]+={3}[^=]|$)
这张照片是:

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

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

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

请注意,我们使用PHP正则表达式模式中修改的/s作为点所有模式。这确保了模式中使用的.*在换行符之间匹配。

尽管我的正则表达式已经生锈,但一个简单的方法是

preg_match_all("/(?:\s|^)===(\w*)===\s/", $input, $sections);
那么就?:\s | ^===\w*==\s这是空白或文档的开头,===的文本,然后是===,最后是空白

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

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

    [2] =>  ===C===

)
使用

$sections = preg_split("/(?:\s|^)===(\w*)===\s/", $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

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

    [2] => B
    [3] =>           b

    [4] => C
    [5] =>           c
)

请显示您所需的输出应该是什么样子的?preg_match_all'/^===[^=]*==?:\R?!=**/m',$s$matches@CodeManiac输出是拆分数据的一维数组,类似于“捕获的节名”、“节数据”。因此,like first是空的[,'A','A===0===0','B','B'…]这就是为什么它应该是空的你似乎很惊讶分割函数用它不匹配的东西来生成元素。这就是split所做的。。。而且,在99.99%的情况下,拆分只适用于最简单的原子作业。无论如何都不是为了你想用它来做的。@sln它对我的casehi thx很好,可以快速回答,但它应该是[0]==A==A==0==0。忽略3倍以上的数据,并将其视为截面数据。那么使用preg split呢?@luky抱歉,我猜我误解了你的问题,可能是因为你从未向我们展示过你想要的输出。我根据你的评论更新了我的答案。是的,我没有解释清楚,对不起。很酷,但是你能把工作分成两部分吗?这将是最好的:我不会为此使用preg_split,因为您的目标是捕获所有内容。拆分通常意味着使用read:删除输入中的一些内容,也就是说,除非使用lookarounds完全拆分,这在这里可能很难表达。因此,我将继续使用preg_match_all解决方案。是的,谢谢您的快速帮助。问题是它捕获了我在下面所说的行之间的3x=。是的,问题是我看到了,它从===0===0中取最后一个=并将下一行的新节名设置为===B,因此它还需要以某种方式绑定到新行约束。。你做了,谢谢。我想它应该有用
Array
(
    [0] => A
    [1] =>           a
          ====0====
          0

    [2] => B
    [3] =>           b

    [4] => C
    [5] =>           c
)