PHP preg_split将分隔符保留在其他元素中

克雷格

我正在尝试将字符串分成多个部分。

字符串示例...

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PHP preg_split或preg_match句子,但将标点符号保留在数组中

PHP的preg_split忽略重复的分隔符

如何将分隔符保留在 preg_split 的下一项中?

PHP preg_split使用分隔符作为数组键

如何显示div中字符串中的前两个单词并保留在其他span php中?

遍历字符串,但将分隔符保留在子字符串中,包括其他规则

在分隔符上拆分列表-将分隔符保留在组中

将PHP函数保留在RAM中

将UITableView填充保留在标头上,但不保留在IOS7的分隔符中

如何使用php preg_split分割字符串并保留部分使用的定界符?

像`column -t`这样的命令,而是将分隔符保留在输出中

是否可以将记录分隔符保留在awk中?

PHP:使用 preg_split 分隔字母和数字

PHP preg_split在双引号中保留特殊字符

php preg_split语言

PHP preg_split与\ t

PHP preg_split数据

如何改组php数组,但将索引保留在foreach中

php:仅将最大值保留在数组中?

PHP 重定向但将页面保留在历史记录中

使用php提交后将表单数据保留在字段中

重定向后将php值保留在页面中

提交PHP和HTML之后,将值保留在数组中

PhP导出.csv更改分隔符从逗号到其他

如何获取MySQL查询并保留在PHP分页中?

会话变量是否保留在php的内存中

正则表达式模式 + preg_split 保留分隔符

如何使用PHP中的preg_split将foreach循环中的字符串匹配

如何使用2个分隔符的正则表达式拆分字符串,但将分隔符保留在Python中?