我正在尝试将字符串分成多个部分。
字符串示例...
The quick brown fox [[random text here]] and then [[a different text here]]
方括号之间的文本将更改,无法提前确定。我到目前为止的preg_split将会拆分,但是它将分隔符放置在生成的数组中的其他元素中,而不是我想要包含在其中的元素。
$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]]"
由于我对Regex的了解还很遥远,请问有人可以告诉我正则表达式中缺少什么吗?
这将使您更加接近
$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]]
)
当我说的时候pretty close
,我的意思是真的非常接近...
正则表达式是相当直接的,捕获2[
然后什么,但]
随后的2 ]
。这就是我们的定界符,然后我们将其捕获。没有空标记也很好。
请享用!
更新
但在“这是我的表[[{{widget”:“ table”,“ id”:“ 1”,“ title”:“ Views Table”,“ columns”:[]}]]上失败,并且更多文字” ...请注意“列”下的“ []”
为了解决这个问题,您将需要使用的递归正则表达式模式(?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] => 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]
)
请注意,它如何不捕获[someother bracket]
,但是捕获另外2次。可能有解决的办法,但我想不到。
我不知道是否捕获单个括号对是一个问题。
但是我以前使用过这个方法,主要用于匹配"
或,( )
但它是同一概念的匹配对。
唯一的其他解决方案是为此创建一个词法分析器/解析器,我在我的GitHub帐户上有一些这样做的示例。正则表达式(本身)不适用于嵌套元素。大多数任何正则表达式解决方案都会在嵌套时失败。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句