【问题标题】:Extracting all values between curly braces regex php提取大括号正则表达式php之间的所有值
【发布时间】:2013-12-30 11:29:03
【问题描述】:

我有这种形式的内容

$content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>";

我需要数组中大括号之间的所有值,如下所示:

array("0"=>"123456","1"=>"7894560","2"=>"145789")

我尝试使用此代码:

<?php
preg_match_all("/\{.*}\/s", $content, $matches);
?>

但是我在这里输入了从第一个花括号到内容中最后一个值的值。可以做些什么来获得上述格式的数组?我知道我使用的模式是错误的。应该给出什么来获得如上所示的期望输出?

【问题讨论】:

  • Similar question。唯一的区别可能是您有 1 个大括号而不是 2 个,但原理保持不变。主要问题是.* 是贪婪的。几乎所有关于这个问题的答案都解决了这个问题。

标签: php regex preg-match


【解决方案1】:

这样做...

<?php
$content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>";
preg_match_all('/{(.*?)}/', $content, $matches);
print_r(array_map('intval',$matches[1]));

输出:

Array
(
    [0] => 123456
    [1] => 7894560
    [2] => 145789
)

【讨论】:

    【解决方案2】:

    没有提到两个紧凑的解决方案:

    (?<={)[^}]*(?=})
    

    {\K[^}]*(?=})
    

    这些允许您直接访问匹配项,无需捕获组。例如:

    $regex = '/{\K[^}]*(?=})/m';
    preg_match_all($regex, $yourstring, $matches);
    // See all matches
    print_r($matches[0]);
    

    说明

    • (?&lt;={)lookbehind 断言前面是一个左大括号。
    • 在选项 2 中,{ 匹配左大括号,然后 \K 告诉引擎放弃到目前为止匹配的内容。 \K 在 Perl、PHP 和 R(使用 PCRE 引擎)和 Ruby 2.0+ 中可用
    • [^}] 否定字符类表示一个不是右大括号的字符,
    • 并且* 量词匹配零次或多次
    • 前瞻(?=}) 断言后面是右大括号。

    参考

    【讨论】:

    • +1 两种选择!特别是对于\K 版本。以前没听过..
    • 那么这比公认的答案更高效吗?如果是,那值得一提。
    【解决方案3】:

    演示:https://eval.in/84197

    $content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>";
    preg_match_all('/{(.*?)}/', $content, $matches);
    foreach ($matches[1] as $a ){
    echo $a." ";
    }
    

    输出:

    123456 7894560 145789 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2018-12-24
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 2023-01-14
      相关资源
      最近更新 更多