到现在为止,我正在使用正则表达式:'/{(.*?)}/'
将所有内容放在卷曲的barackets中,如:'abc {get me} def {and get me}'
这样可以正常工作。
现在我正在寻找一种排除括号的方法,括号本身被括号括起来。字符串应该是不言自明的:'abc {get me {!but not me!}} def {and get {!but not me again!} me} ghi'
。
以下代码应说明我的需求......
<?php
$regex = '/{(.*?)}/';
$string = 'abc {get me {!but not me!}} def {and get {!but not me again!} me} ghi';
preg_match_all( $regex, $string, $matches );
print_r( $matches[1] );
?>
打印:
Array
(
[0] => get me {!but not me!
[1] => and get {!but not me again!
)
但应该是:
Array
(
[0] => get me {!but not me!}
[1] => and get {!but not me again!} me
)
到目前为止,我无法通过Google找到解决方案,并期待在SO上找到解决方案。
问候
修改 Actually a very similar question was asked and answered on SO.但是如果你不熟悉正则表达式,很难从包装(...)更改为 {...} 。因此,您不能简单地采用答案给出的一种模式(请参阅上面的链接)并搜索 - 替换所有&#39;(&#39;&amp;&#39;)&#39;用&#39; {&#39; &安培; &#39;}&#39 ;.你真的必须了解那里发生了什么。
但如果你理解这种模式足以自定义它,你可能可以自己编写它......
答案 0 :(得分:2)
你需要一个 recursive regex 一个捕获组来捕获大括号内的内容:
{((?:[^{}]++|(?R))*)}
<强>解释强>:
{
- 文字{
(在PHP PCRE中,您无需转义此字符)(
- 开始捕获组1
(?:[^{}]++|(?R))*
- 除(?:...)*
和{
以外的1 +个字符的零个或多个序列(请参阅}
)(请参阅[^{}]++
)或整个模式((?R)
是整个模式的占位符,如(?0)
子例程调用))
- 第1组结束}
- 关闭文字}
请参阅regex demo和PHP demo:
$re = '~{((?:[^{}]++|(?R))*)}~';
$str = "abc {get me {!but not me!}} def {and get {!but not me again!} me} ghi";
preg_match_all($re, $str, $matches);
print_r($matches[1]);
答案 1 :(得分:0)
$delimiter_wrap = '~';
$delimiter_left = '{';/* put YOUR left delimiter here. */
$delimiter_right = '}';/* put YOUR right delimiter here. */
$delimiter_left = preg_quote( $delimiter_left, $delimiter_wrap );
$delimiter_right = preg_quote( $delimiter_right, $delimiter_wrap );
$pattern = $delimiter_wrap . $delimiter_left
. '((?:[^' . $delimiter_left . $delimiter_right . ']++|(?R))*)'
. $delimiter_right . $delimiter_wrap;
/* Now you can use the generated pattern. */
preg_match_all( $pattern, $subject, $matches );
致谢:谢谢@Wiktor Stribiżew谁写了我接受的答案......