2

ここでトリッキーな preg_replace_callback 関数 - 確かに、私は PRCE 式が得意ではありません。

HTML の文字列からすべての img src 値を抽出し、img src 値を配列に保存し、さらに img src パスをローカル パス (リモート パスではない) に置き換えようとしています。つまり、他の多くの HTML に囲まれている可能性があります。

img src='http://www.mysite.com/folder/subfolder/images/myimage.png'

myimage.png を配列​​に抽出し、さらに src を次のように変更します。

src='images/myimage.png'

それはできますか?

ありがとう

4

2 に答える 2

3

正規表現を使用する必要がありますか?HTMLの処理は、通常、DOM関数を使用すると簡単になります。

<?php

$domd = new DOMDocument();
libxml_use_internal_errors(true);
$domd->loadHTML(file_get_contents("http://stackoverflow.com"));
libxml_use_internal_errors(false);

$items = $domd->getElementsByTagName("img");
$data = array();

foreach($items as $item) {
  $data[] = array(
    "src" => $item->getAttribute("src"),
    "alt" => $item->getAttribute("alt"),
    "title" => $item->getAttribute("title"),
  );
}

print_r($data);
于 2011-03-29T14:24:49.003 に答える
1

これには正規表現が必要ですか?必要はありません。正規表現は最も読みやすいソリューションですか?おそらくそうではありません-少なくとも正規表現に堪能でない限り。大量のデータをスキャンする場合、正規表現はより効率的ですか?絶対に、正規表現は最初の出現時にコンパイルおよびキャッシュされます。正規表現は「コードの最小行」トロフィーを獲得しますか?

$string = <<<EOS
<html>
<body>
blahblah<br>
<img src='http://www.mysite.com/folder/subfolder/images/myimage.png'>blah<br>
blah<img src='http://www.mysite.com/folder/subfolder/images/another.png' />blah<br>
</body>
</html>
EOS;

preg_match_all("%<img .*?src=['\"](.*?)['\"]%s", $string, $matches);
$images = array_map(function ($element) { return preg_replace("%^.*/(.*)$%", 'images/$1', $element); }, $matches[1]);

print_r($images);

2行のコード。これはPHPではアンダーカットするのが難しいです。その結果、次の$images配列になります。

Array
(
  [0] => images/myimage.png
  [1] => images/another.png
)

匿名関数を適切なものに置き換えない限り、これは5.3より前のバージョンのPHPでは機能しないことに注意してください。

于 2011-03-29T14:40:41.573 に答える