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}}$)
或字符串结尾[[
$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]]
,然后`然后,等等?它既匹配了[[…]`又匹配了[[[…]]]之外的所有内容。
据我所知,它不会将字符串的所有部分拆分为数组中的元素,它只提取匹配项。即[…]]内的所有内容包括括号,括号外的文字将被省略。不过,不要抱怨,谢谢你教我新技巧:)