【问题标题】:How to get specific String within a string and turn into Array using PHP如何使用 PHP 获取字符串中的特定字符串并转换为数组
【发布时间】:2014-10-03 18:12:09
【问题描述】:

如何使用 PHP 获取字符串中的特定字符串?

我尝试使用preg_match,但结果不是我想要的。

示例字符串:

创建者:Adobe InDesign CC (Macintosh) 制作者:Adobe PDF Library 10.0.1 创建日期:2014 年 8 月 8 日星期五 10:37:26 修改日期:2014 年 8 月 8 日星期五 10:37:29 标记:无 表单:无 页数:2加密:无页面大小:612.283 x 858.898 pts(旋转0度)Mediabox:0.00 0.00 612.28 858.90裁剪:0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0 0.00 0.0 0.18.50 8.50 603.78 850.39 Artbox:0.00 0.00 0.00 0.00 612.28 858.90文件大小:28126860字节优化:无PDF版本:1.6

这是 pdfinfo test.pdf 命令行的结果:

我想要的是得到这样的特定字符串:

媒体框:0.00 0.00 612.28 858.90 裁剪框:0.00 0.00 612.28 858.90 出血框:0.00 0.00 612.28 858.90 裁切框:8.50 8.50 603.78 850.39 美工框:0.00 858.0.0 962 0.08 85.>p

并把它放在一个数组列表中。结果会是这样的:

[
'Mediabox'  => [0.00,0.00,612.28,858.90],
'CropBox'   => [0.00 0.00 612.28 858.90],
'BleedBox'  => [0.00 0.00 612.28 858.90],
'TrimBox'   => [8.50 8.50 603.78 850.39]
]

【问题讨论】:

    标签: php regex parsing preg-match


    【解决方案1】:

    一种方法,在空格处爆炸字符串

    $str = "MediaBox: 0.00 0.00 612.28 858.90 CropBox: 0.00 0.00 612.28 858.90 BleedBox: 0.00 0.00 612.28 858.90 TrimBox: 8.50 8.50 603.78 850.39 ArtBox: 0.00 0.00 612.28 858.90"; 
    $array = array(); 
    
    foreach (explode(" ",$str) as $value)
    {
        if (!is_numeric($value))
            $box = substr($value, 0, -1);
        else
            $array[$box][] = $value;
    }
    

    【讨论】:

    • 这个是正确的。更简单...谢谢 Lenny
    【解决方案2】:

    我测试了这段代码,它似乎产生了您预期的输出:

    $str = "Creator: Adobe InDesign CC (Macintosh) Producer: Adobe PDF Library 10.0.1 CreationDate: Fri Aug 8 10:37:26 2014 ModDate: Fri Aug 8 10:37:29 2014 Tagged: no Form: none Pages: 2 Encrypted: no Page size: 612.283 x 858.898 pts (rotated 0 degrees) MediaBox: 0.00 0.00 612.28 858.90 CropBox: 0.00 0.00 612.28 858.90 BleedBox: 0.00 0.00 612.28 858.90 TrimBox: 8.50 8.50 603.78 850.39 ArtBox: 0.00 0.00 612.28 858.90 File size: 28176860 bytes Optimized: no PDF version: 1.6";
    
    $matches = array();
    $count   = preg_match_all("/(MediaBox|CropBox|BleedBox|TrimBox):\s([0-9]+\.[0-9]+\s[0-9]+\.[0-9]+\s[0-9]+\.[0-9]+\s[0-9]+\.[0-9]+)/", $str, $matches, PREG_PATTERN_ORDER);
    
    header("Content-Type: text/plain;charset=UTF-8");
    
    array_shift($matches);
    
    $str_keys   = $matches[0];
    $str_values = $matches[1];
    $result     = array();
    
    for ($i = 0; $i < $count; ++$i) {
      $result[$str_keys[$i]] = explode(" ", $str_values[$i]);
    }
    
    echo json_encode($result, JSON_PRETTY_PRINT);
    

    输出:

    {
        "MediaBox": [
            "0.00",
            "0.00",
            "612.28",
            "858.90"
        ],
        "CropBox": [
            "0.00",
            "0.00",
            "612.28",
            "858.90"
        ],
        "BleedBox": [
            "0.00",
            "0.00",
            "612.28",
            "858.90"
        ],
        "TrimBox": [
            "8.50",
            "8.50",
            "603.78",
            "850.39"
        ]
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      使用以下正则表达式,您将获得每个匹配的两个捕获组。第一个是关联数组中的键,第二个是值。

      这是preg_match 中使用的正则表达式,例如:

      (MediaBox|CropBox|BleedBox|TrimBox):((?: (?:\d+(?:\.\d{1,2}))){3})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-12
        相关资源
        最近更新 更多