【问题标题】:PHP get array from regexPHP从正则表达式获取数组
【发布时间】:2013-12-03 19:01:05
【问题描述】:

我有类似的字符串

$content = "Some content some content
[images ids="10,11,20,30,40"]
Some content";

我想从中删除 [images ids="10,11,20,30,40"] 部分并将 ids 部分作为 php array(10,11,20,30,40)

可以用正则表达式吗?

【问题讨论】:

  • 你有没有尝试过?请给代码。
  • 我做了字符串替换,然后数组用逗号爆炸,但我认为这不是一个好的解决方案。
  • @Kluska000 如果您知道字符串的格式,那么您正在做的事情对我来说听起来是个好主意
  • 是的,这就是任何人都会做的事情......
  • 你可能不能用一个 preg 函数来做这两件事。

标签: php regex


【解决方案1】:

你可以用这个:

$txt = <<<LOD
Some content some content
[images ids="10,11,20,30,40"]
Some content
LOD;

$result = array();

$txt = preg_replace_callback('~(?:\[images ids="|\G(?!^))([0-9]+)(?:,|"])~',
    function ($m) use (&$result) { $result[] = $m[1]; }, $txt);
        
echo $txt . '<br>' . print_r($result, true);

\G 锚在这种情况下非常有用,因为它是一种锚,表示 “在字符串的开头或与先例匹配”

但是,模式中的任何内容都不会检查是否有最后一个数字后跟"]。如果你需要这样做,你必须在模式中添加一个前瞻:

~(?:\[images ids="|\G(?!^))([0-9]+)(?=(?:,[0-9]+)*"])(?:,|"])~

【讨论】:

  • @anubhava:谢谢anubhava! \G 功能就像点金石,你搜索了很久,但是它非常强大。
  • 是的,我在您之前的一个答案中了解到\G。谢谢!
【解决方案2】:

假设这是内容的结构并且它没有变得更复杂,那么:

preg_match_all('/(\d+)/', $content, $matches);
print_r($matches[0]);

如果它更复杂,则需要添加更多以缩小范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多