我需要在php中使用正则表达式,允许以下内容:
这是给定的例子
1. aaa aaa {bb b {c cc} {d dd} e ee} xxx
2. 123 {asd {asd {asd {asd} asd}} asd} qwe
输出将是:
1. {bb b {c cc} {d dd} e ee}
2. {asd {asd {asd {asd} asd}} asd}
我尝试了这个但是不起作用
preg_match_all('/{(.*?)}/', $resonse, $matches);
它基本上摆脱了主要花括号之外的任何事情。在它内部有花括号。我真的需要你的帮助。非常感谢。
答案 0 :(得分:3)
您需要PCRE的递归功能才能执行此操作。
<?php
$pattern = '!
{ # patterns start with curly brace
(?: # ?: means that this is only for grouping, not for capturing
# the { } contain
[^{}]* # not-curly-braces-characters
| # or
(?R) # this pattern again, i.e. {^[{}] | (?R) } again
)*
} # patterns ends with curly brace
!x';
foreach( array('aaa aaa{bb b {c cc}{d dd}e ee}xxx', '123{asd{asd{asd{asd}asd}}asd}qwe') as $subject ) {
echo "\n$subject: ";
if ( preg_match($pattern, $subject, $m) ) {
echo $m[0];
}
else {
echo '--no match--';
}
}
打印
aaa aaa{bb b {c cc}{d dd}e ee}xxx: {bb b {c cc}{d dd}e ee}
123{asd{asd{asd{asd}asd}}asd}qwe: {asd{asd{asd{asd}asd}}asd}
答案 1 :(得分:2)
你根本不需要正则表达式:
$str = 'aaa aaa{bb b {c cc}{d dd}e ee}xxx';
$replace = substr(substr($str, 0, strrpos($str, '}') + 1), strpos($str, '{'));
echo $replace; // displays "{bb b {c cc}{d dd}e ee}"
如果您对这段代码进行基准测试,它可能比正则表达式快得多。你不应该使用复杂的东西来做这么简单的事情。
我想你可能想要匹配每个字符串的多个结果。在这种情况下,我仍然可能有一个不依赖任何模块的更快的解决方案:
$str = 'aaa aaa{bb b {c cc}{d dd}e ee}xxxaaa qaaa{bb b {cqwe cc}{d cdd}e qweee}xxx';
$array = str_split($str);
$opens = 0;
$result = '';
$results = array();
for($i = 0; $i < count($array); $i++) {
if($array[$i] === '{') {
$opens++;
} else if($array[$i] === '}' && $opens > 0) {
$opens--;
}
if($opens > 0) $result .= $array[$i];
if($opens === 0 && strlen($result) > 0) {
$results[] = $result . '}';
$result = '';
}
}
print_r($results);
/*
results:
Array
(
[0] => {bb b {c cc}{d dd}e ee}
[1] => {bb b {cqwe cc}{d cdd}e qweee}
)
*/
答案 2 :(得分:0)
<?php
$str = "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz" ;
$str = preg_match("#\{((?>[^\{\}]+)|(?R))*\}#x", $str, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>
答案 3 :(得分:0)
也许会这样做:preg_replace('/(^[^{]*)|([^}]*$)/', '', 'aaa aaa{bb b {c cc}{d dd}e ee}xxx');
答案 4 :(得分:0)
这真的是正则表达式的工作吗?通过查找第一个{
和最后一个}
来获取所需的子字符串似乎更容易。例如,这个:
$str = "abc {kjlj { jkljlkj } ljkj } kljlj";
$start = strpos($str, '{'); # First {
$end = strrpos($str, '}'); # Last }
$section = substr($str, $start, $end - $start + 1);
echo $section; # => "{kjlj { jkljlkj } ljkj }"