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

18

我有这种形式的内容

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

我在这里获取了从第一个大括号到内容中最后一个大括号之间的值。如何才能得到上述格式的数组?我知道我使用的模式是错误的。应该给出什么以获得所需的输出?


1
类似问题。唯一的区别可能是你只有一个大括号而不是两个,但原则仍然相同。主要问题是.*是贪婪的。那个问题上几乎所有的答案都解决了这个问题。 - Jerry
3个回答

28

像这样做...

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

22

没有提到两个简洁的解决方案:

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

{\K[^}]*(?=})
这些允许您直接访问匹配项,而无需使用捕获组。例如:
$regex = '/{\K[^}]*(?=})/m';
preg_match_all($regex, $yourstring, $matches);
// See all matches
print_r($matches[0]);

解释

  • (?<={) 向后预查,断言前面是一个左括号。
  • 在选项2中,{ 匹配左括号,然后 \K 告诉引擎放弃之前匹配的部分。 \K 可用于Perl、PHP和R(使用PCRE引擎)以及Ruby 2.0+。
  • [^}] 反向字符类表示不是右括号的一个字符,
  • * 量词匹配零次或多次该字符
  • (?=}) 向前预查,断言后面是一个右括号。

参考资料


两种选择都赞!特别是 \K 版本,之前从未听说过。 - hek2mgl
那么这个方案的性能比已接受的答案更好吗?如果是,值得一提。 - Alex

4

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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接