提取花括号正则表达式php之间的所有值

时间:2013-12-30 11:29:03

标签: php regex preg-match

我有这种形式的内容

$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);
?>

但我在这里得到的值从第一个大括号到内容中找到的最后一个。如何以上述格式获取数组?我知道我使用的模式是错误的。如何获得上面显示的所需输出?

3 个答案:

答案 0 :(得分:20)

这样做......

<?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
)

答案 1 :(得分:18)

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

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

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

这些允许您直接访问匹配项,而不使用捕获组。例如:

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

<强>解释

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

<强>参考

答案 2 :(得分:2)

DEMO: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