Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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 preg_分割将分隔符保留在不同的元素中_Php_Regex - Fatal编程技术网

PHP preg_分割将分隔符保留在不同的元素中

PHP preg_分割将分隔符保留在不同的元素中,php,regex,Php,Regex,我正试图将一个字符串拆分为一组部分 字符串示例 The quick brown fox [[random text here]] and then [[a different text here]] 方括号之间的文本将发生变化,无法提前确定。到目前为止,我使用的preg_分割将被分割,但它将分隔符放置在生成的数组中的其他元素中,而不是我希望它位于的元素中 $page_widget_split = preg_split('@(?<=\[\[)(.*?)(?=\]\])@', $page_c

我正试图将一个字符串拆分为一组部分

字符串示例

The quick brown fox [[random text here]] and then [[a different text here]]
方括号之间的文本将发生变化,无法提前确定。到目前为止,我使用的preg_分割将被分割,但它将分隔符放置在生成的数组中的其他元素中,而不是我希望它位于的元素中

$page_widget_split = preg_split('@(?<=\[\[)(.*?)(?=\]\])@', $page_content,-1, PREG_SPLIT_DELIM_CAPTURE);
预期结果如下所示

[0] => "The quick brown fox [[",
[1] => "random text here]]",
[2] => " and then [[",
[3] => "a different text here]]"
[0] => "The quick brown fox",
[1] => "[[random text here]]",
[2] => " and then ",
[3] => "[[a different text here]]"

由于我对正则表达式还不太了解,请有人看一下,告诉我正则表达式中缺少了什么吗?

这会让你非常接近

 $page_content = 'the quick brown fox [[random text here]] and then [[a different text here]]';

 print_r(preg_split('/(\[\[[^\]]+\]\])/', $page_content, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
要记住的是,这是分隔符
(\[\[^\]+\]\]\]])

输出:

Array
(
    [0] => the quick brown fox 
    [1] => [[random text here]]
    [2] =>  and then 
    [3] => [[a different text here]]
)
Array
(
    [0] => here is my table 
    [1] => [[{"widget":"table","id":"1","title": "Views Table", "columns": []}]]
    [2] =>  and this is more text 
    [3] => [someother bracket] //single bracket capture
)

当我说相当接近时,我的意思是非常接近

正则表达式非常简单,捕获2个
[
然后捕获除
]
之外的任何内容,然后捕获其中的2个
]
。这就是我们的定界符,然后我们捕获它。没有空旗也不错

享受吧

更新

但它在“这是我的表[[{”小部件“:“表”,“id:“1”,“标题:“视图表”,“列”:[]}]]上失败,这是更多的文本”…注意“列”下的“[]”

要处理这个问题,您需要使用
(?R)
的递归正则表达式模式,如下所示:

$page_content = 'here is my table [[{"widget":"table","id":"1","title": "Views Table", "columns": []}]] and this is more text [someother bracket]';

print_r(preg_split('/(\[(?:[^\[\]]|(?R))*\])/', $page_content, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
输出:

Array
(
    [0] => the quick brown fox 
    [1] => [[random text here]]
    [2] =>  and then 
    [3] => [[a different text here]]
)
Array
(
    [0] => here is my table 
    [1] => [[{"widget":"table","id":"1","title": "Views Table", "columns": []}]]
    [2] =>  and this is more text 
    [3] => [someother bracket] //single bracket capture
)

我不会假装,这是我对正则表达式知识的一种边缘,我应该注意这匹配单括号,而不是双括号。您可以尝试这样的
/(\[(?:[^\[\].;(?2))*\])\]/
对于特定的捕获组,
(?2)
类似于
(?R)
。在保持内部嵌套的同时,它只与
[[…]]
匹配。但问题是,然后您复制了捕获,因此您将得到以下结果:

Array
(
    [0] => here is my table 
    [1] => [[{"widget":"table","id":"1","title": "Views Table", "columns": []}]]
    [2] => [{"widget":"table","id":"1","title": "Views Table", "columns": []}]
    [3] =>  and this is more text [someother bracket]
)
请注意,它如何不捕获
[其他括号]
,而是捕获另一个括号两次。也许有办法,但我想不起来

我不知道是否捕获单括号对

但是我以前用过这个,主要是为了匹配,匹配对的
()
,但它是相同的概念


唯一的其他解决方案是为它制作一个lexer/parser,我有一些例子说明如何在我的帐户上实现这一点不适合嵌套元素。大多数ReEX解决方案在嵌套时都会失败。

< P>您可以考虑使用<代码> PrggMatMatHyLo.< /C> >,这可能会使正则表达式的逻辑更容易理解:

/\[{2}.+?\]{2}|.+?(?=\[{2}|$)/
交替:

  • \[{2}.+?\]{2}
    ,匹配
    [[
    ,惰性重复字符,后跟匹配的
    ]
    ,或

  • +?(?=\[{2}}$)
    ,延迟重复字符,直到前瞻匹配
    [[
    或字符串结尾

在PHP中:

$str = "The quick brown fox [[random text here]] and then [[a different text here]] foobar";
preg_match_all('/\[{2}.+?\]{2}|.+?(?=\[{2}|$)/',$str, $result);

不…我的打字错误..修复了…问题仍然存在。测试正则表达式的一个好方法是,看起来它正在工作…gunna再测试一点并标记为答案。正则表达式适用于这样的实例:“这是我的表[[[{”小部件“:“表”,“id:“1”,“标题”:“视图表”,“列”:“}]”,这是更多文本,但它失败了”这是我的表[[{“widget”:“table”、“id”:“1”、“title”:“Views table”、“columns”:[]}]],这是更多的文本“…注意,“'columns'参数下的“[]”表示字符串中的数组?似乎当正则表达式在字符串中遇到此情况时,正则表达式返回负数并继续,但没有找到有效的[…]]很好,你是个明星搭档。总有一天我会了解regex。
总有一天我会了解regex。
这很简单。你只需要理解它是自己的语言,比如HTML或SQLA。这可能也是一个答案,在我看到第一个解决方案时还没有测试过。谢谢。这个答案确实成功地提取了[…]]匹配,但不返回[…]之外的文本以及数组中的元素。我需要字符串的所有“部分”作为数组中的元素返回,并拆分为文本部分和[…]部分。我以为它会这样做?请参阅regex101,它提取了
快速棕色狐狸
,然后
[[random text here]]
,然后`然后,等等?它既匹配了[[…]`又匹配了
[[[…]]]之外的所有内容。
据我所知,它不会将字符串的所有部分拆分为数组中的元素,它只提取匹配项。即[…]]内的所有内容包括括号,括号外的文字将被省略。不过,不要抱怨,谢谢你教我新技巧:)