在PHP中获取花括号标记之间的字符串的正则表达式
$HTML: 数据是动态的,可以是任何字符串 我正在尝试使用以下代码循环所有发生的事件:在PHP中获取花括号标记之间的字符串的正则表达式,php,arrays,regex,Php,Arrays,Regex,$HTML: 数据是动态的,可以是任何字符串 我正在尝试使用以下代码循环所有发生的事件: {list:start:Data} {id} is having a title of {title} {list:end:Data} 我希望得到以下结果: preg_match_all('/\{list:start:(.*?)\}(.*?)\{list:end:(.*?)\}/', $HTML, $match); 但我得到了以下结果: $match = array( array(
{list:start:Data}
{id} is having a title of {title}
{list:end:Data}
我希望得到以下结果:
preg_match_all('/\{list:start:(.*?)\}(.*?)\{list:end:(.*?)\}/', $HTML, $match);
但我得到了以下结果:
$match = array(
array(
"string" => "Data",
"value" => "{id} is having a title of {title}"
)
);
但是$match返回一个空数组时,这就不起作用了。在搜索了几个小时的解决方案后,我仍然没有接近一个工作结果。您需要避开大括号,并使用
/s
匹配多行。下面是代码示例
代码
作为一种替代方法,您可以使用,而不是使用带有/s
修饰符的*?
,使点与换行符匹配
如果您不想匹配以{list:
开头的连续行,您可以使用负前瞻性排除这些匹配
Array
(
[0] => Array
(
[string] => Data
[data] => {id} is having a title of {title}
)
[1] => Array
(
[string] => Data1
[data] => {id1} is having a title of {title1}
)
[2] => Array
(
[string] => Data2
[data] => {id2} is having a title of {title2}
)
[3] => Array
(
[string] => Data3
[data] => {id3} is having a title of {title3}
)
)
模式匹配:
^
字符串的开头
{list:start:
逐字匹配(注意,{
不需要转义)
(
Capturegroup 1
[^}]+
匹配除}
)
关闭第1组
}
匹配结束}
\R
匹配任何unicode换行符序列
(
捕获第2组
(?:(?!{list:).*\R)*+
重复匹配所有行,只要它们不是以list:
)
关闭第2组
{list:end:
按字面匹配
[^}]+
匹配除}
}
匹配结束}
见a和a
示例代码
^{list:start:([^}]+)}\R((?:(?!{list:).*\R)*+){list:end:[^}]+}
输出
$re = '/^{list:start:([^}]+)}\R((?:(?!{list:).*\R)*){list:end:[^}]+}/m';
$str = '{list:start:Data}
{id} is having a title of {title}
{list:end:Data}
{list:start:Data}
{list:start:Data}
{id} is having a title of {title}
this is some text
{list:end:Data}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
print_r(array_map(function($x){
return [
"string" => $x[1],
"data" => trim($x[2])
];
}, $matches));
请您提供示例值,以便您的问题有一个完整的答案?另外,请详细说明“不工作”-到底发生了什么?@El_Vanja请查看更新的问题。谢谢,我还不清楚这里发生了什么事$HTML
应该是一个字符串,那么您如何期望数组在其中呢?$HTML
的变量转储给您带来了什么?如果您不想跨越以列表开头的行:
非常感谢!这正是我想要的答案。
$re = '/^{list:start:([^}]+)}\R((?:(?!{list:).*\R)*){list:end:[^}]+}/m';
$str = '{list:start:Data}
{id} is having a title of {title}
{list:end:Data}
{list:start:Data}
{list:start:Data}
{id} is having a title of {title}
this is some text
{list:end:Data}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
print_r(array_map(function($x){
return [
"string" => $x[1],
"data" => trim($x[2])
];
}, $matches));
Array
(
[0] => Array
(
[string] => Data
[data] => {id} is having a title of {title}
)
[1] => Array
(
[string] => Data
[data] => {id} is having a title of {title}
this is some text
)
)