Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中获取花括号标记之间的字符串的正则表达式_Php_Arrays_Regex - Fatal编程技术网

在PHP中获取花括号标记之间的字符串的正则表达式

在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(

$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(
      "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
        )

)