hm7*_*711 9 php regex brackets
我正在尝试制作一个php正则表达式工作,解析括号中的文本字符串,同时忽略可能的嵌套括号:
让我们说我想要
Lorem ipsum [1. dolor sit amet, [consectetuer adipiscing] elit.]. Aenean commodo ligula eget dolor.[2. Dolor, [consectetuer adipiscing] elit.] Aenean massa[3. Lorem ipsum] dolor.
Run Code Online (Sandbox Code Playgroud)
回来
[1] => "dolor sit amet, [consectetuer adipiscing] elit."
[2] => "Dolor, [consectetuer adipiscing] elit."
[3] => "Lorem ipsum"
Run Code Online (Sandbox Code Playgroud)
到目前为止我得到了
'/\[([0-9]+)\.\s([^\]]+)\]/gi'
Run Code Online (Sandbox Code Playgroud)
但是当嵌套括号出现时它会中断.见演示
我怎样才能忽略检测中的内括号?Thx提前!
您可以对以前的组使用递归引用:
(?<no_brackets>[^\[\]]*){0}(?<balanced_brackets>\[\g<no_brackets>\]|\[(?:\g<no_brackets>\g<balanced_brackets>\g<no_brackets>)*\])
Run Code Online (Sandbox Code Playgroud)
我们的想法是将您想要的匹配定义为没有括号,被包围[]或者某种东西的东西,其中包含一系列没有括号或平衡括号的第一条规则.
您可以使用此模式来捕获两个不同组中的项目编号和以下文本。如果您确定所有项目编号都是唯一的,您可以使用简单的方法构建问题中描述的关联数组array_combine:
$pattern = '~\[ (?:(\d+)\.\s)? ( [^][]*+ (?:(?R) [^][]*)*+ ) ]~x';
if (preg_match_all($pattern, $text, $matches))
$result = array_combine($matches[1], $matches[2]);
Run Code Online (Sandbox Code Playgroud)
图案详情:
~ # pattern delimiter
\[ # literal opening square bracket
(?:(\d+)\.\s)? # optional item number (*)
( # capture group 2
[^][]*+ # all that is not a square bracket (possessive quantifier)
(?: #
(?R) # recursion: (?R) is an alias for the whole pattern
[^][]* # all that is not a square bracket
)*+ # repeat zero or more times (possessive quantifier)
)
] # literal closing square bracket
~x # free spacing mode
Run Code Online (Sandbox Code Playgroud)
(*)请注意,如果您希望能够使用递归(?R) (例如[consectetuer adipiscing]没有项目编号),则项目编号部分必须是可选的。如果您想避免没有项目编号的方括号,这可能会出现问题。(?:(\d+)\.\s)?在这种情况下,如果将可选组更改为条件语句,则可以构建更强大的模式:(?(R)|(\d+)\.\s)
条件语句:
(?(R) # IF you are in a recursion
# THEN match this (nothing in our case)
| # ELSE
(\d+)\.\s #
)
Run Code Online (Sandbox Code Playgroud)
这样,项目编号就成为强制性的。
| 归档时间: |
|
| 查看次数: |
539 次 |
| 最近记录: |