-1

次の文字列があります

(...)

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、中かっこの間をシークする必要があります。

助けてください。

4

2 に答える 2

0

PCREは可変長後読みをサポートしていないため、これは2回のパスで行う必要があると思います。最初にこれらの「配列」を見つけてから、文字列を抽出します。

配列を見つけるのはそれほど難しくありません(これは生の正規表現であり、必要に応じてエスケープします):

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

これにより、次のような一致として配列が得られます。

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

次に、JSONパーサーを使用するか、別の正規表現を使用して文字列を検索/抽出することにより、適切に解析できます。

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

これにより、文字列値が得られます。注:これらの正規表現は、文字列内のエスケープを考慮していません(たとえば、'that\'s a problem'正しく解析されません)。

于 2012-08-04T10:17:48.297 に答える
0

If from many lines of text, you want to fetch the line starting with api_images and ignore all the other lines, you can use this.

Flow:

  1. Fetch all the lines starting with api_images till the line-ending.
  2. Remove unwanted characters.
  3. Split the string at ,.
  4. Process as desired.

Code:

<?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>";

?>

Each string, i.e./files/a.jpg, /files/avd.jpg /files/5.jpg etc can be accessed by $api_images[0][0], $api_images[0][1], $api_images[0][2] and so on.

Live demo

于 2012-08-04T10:22:27.610 に答える