1

HTML ファイルで最初に見つかったイメージ タグから src を取得する関数を作成しています。ここのこのスレッドの指示に従って、動作しているように見えるものを取得しました。

preg_match_all('#<img[^>]*>#i', $content, $match); 

foreach ($match as $value) {
    $img = $value[0];
                           } 

$stuff = simplexml_load_string($img);
$stuff = $stuff[src];
return $stuff;

しかし、この関数を数分使用した後、次のようなエラーが返されるようになりました。

警告: simplexml_load_string() [0function.simplexml-load-string0]: エンティティ: 1 行目: パーサー エラー: 42 行目の path/to/script のタグ img 行 1 のデータの途中終了。

警告: simplexml_load_string() [0function.simplexml-load-string0]: tp://feeds.feedburner.com/~f/ChicagobusinesscomBreakingNews?i=KiStN" border="0"> 42 行目の path/to/script にあります。

私はPHPが初めてですが、正規表現がHTMLを誤って切り刻んでいるようです。どうすれば「気密性」を高めることができますか?

4

4 に答える 4

2

PHPコードの次の2行は、HTMLファイルのすべてのimgタグのsrc属性のすべての値のリストを提供するはずです。

preg_match_all('/<img\s+[^<>]*src=["\']?([^"\'<>\s]+)["\']?/i', $content, $result, PREG_PATTERN_ORDER);
$result = $result[1];

正規表現を単純にするために、ファイル名にスペースを含めることは許可していません。これを許可する場合は、引用符で囲まれた属性値(スペースを含めることができる)と引用符で囲まれていない属性値(スペースを含めることができない)に別々の選択肢を使用する必要があります。

于 2008-11-29T08:47:39.863 に答える
0

おそらく、正規表現によって取得された「XML」が何らかの理由で適切な XML ではないためです。おそらく、SimpleXML を使用して src を取得する代わりに、src 属性を引き出すより複雑な正規表現を使用するでしょう。この REGEX は、必要なものに近いかもしれません。

<img[^>]*src\s*=\s*['|"]?([^>]*?)['|"]?[^>]*>

実際の HTML 解析ライブラリを使用することもできますが、PHP にどのオプションが存在するかはわかりません。

于 2008-11-28T16:02:26.697 に答える
0

属性内のアンパサンド自体は無効な XML ですが (「&amp;」としてエンコードする必要があります)、一部の人々は HTML ページの URL にそのように配置します (そしてすべてのブラウザーがサポートしています)。たぶんあなたの問題があります。

その場合は、「<code>&(?!amp;)」を「<code>&」に置き換えて、解析する前に文字列をサニタイズできます。

于 2008-11-28T16:09:51.097 に答える
0

別の主題について:

foreach ($match as $value) {
    $img = $value[0];
                           } 

で置き換えることができます

$img = $match[count($match) - 1][0];

このようなもの:

if (preg_match('#<img\s[^>]*>#i', $content, $match)) {
    $img = $match[0]; //first image in file only
    $stuff = simplexml_load_string($img);
    $stuff = $stuff[src];
    return $stuff;
} else {
    return null; //no match found
}
于 2008-11-28T16:34:02.153 に答える