正则表达式从javascript-like-array-string中提取多个值

时间:2012-08-04 09:53:22

标签: regex

我有以下字符串

(...)

api_images = ['/files/a.jpg','/files/avd.jpg','/files/5.jpg'];
api_titles = 3;
api_descriptions = 42;

我需要一个正则表达式从大括号[]中提取值,如下所示:

  • /files/a.jpg
  • /files/avd.jpg
  • /files/5.jpg

字符串很长,并且可以包含很少的数组,因此正则表达式必须与单词api_images匹配,并在大括号之间进行搜索。

请帮忙。

2 个答案:

答案 0 :(得分:0)

由于PCRE不支持variable-length look-behind,我认为你应该两次通过;首先找到这些“数组”,然后提取字符串。

查找数组并不太难(这是原始正则表达式,根据需要进行转义):

\[(?:[^\]\['"]+|'[^']*'|"[^"]*")*\]

这将为您提供如下匹配的数组:

['/files/a.jpg','/files/avd.jpg','/files/5.jpg']

然后可以使用JSON解析器或使用另一个正则表达式来查找/提取字符串,从而很好地解析:

(?<=')[^']+(?=')|(?<=")[^"]+(?=")

这将为您提供字符串值。注意:这些正则表达式不考虑字符串中的转义(例如,'that\'s a problem'无法正确解析)。

答案 1 :(得分:0)

如果从多行文本中,您想要获取以api_images开头的行并忽略所有其他行,则可以使用此行。

<强>流量:

  1. 获取以api_images开头的所有行,直到行尾。
  2. 删除不需要的字符。
  3. 将字符串拆分为,
  4. 按需处理。
  5. 代码:

    <?php
    $str = "api_images = ['/files/a.jpg','/files/b.jpg','/files/c.jpg'];
        api_titles = 3;
        api_descriptions = 42;
        api_images = ['/files/1.jpg','/files/2.jpg','/files/3.jpg'];
        api_titles = 3;
        api_descriptions = 42;";
    
    //Find all the lines starting with "api_images"
    preg_match_all("/(api_images.*)/", $str, $matches);
    $api_images = $matches[0];
    
    $count_api_images = count($api_images);
    for($i=0;$i<$count_api_images;$i++){
        $api_images[$i] = str_replace("api_images = [", "", $api_images[$i]);
        $api_images[$i] = str_replace("'", "", $api_images[$i]);
        $api_images[$i] = str_replace("]", "", $api_images[$i]);
        $api_images[$i] = str_replace(";", "", $api_images[$i]);
        $api_images[$i] = explode(",", $api_images[$i]);
    }
    
    echo "<pre>";
    print_r($api_images);
    echo "</pre>";
    

    &GT;

    /files/a.jpg/files/avd.jpg/files/5.jpg等可以访问每个字符串,即$api_images[0][0]$api_images[0][1] $api_images[0][2]等。< / p>

    Live demo