4

下の行から「img」タグの終わりと「a」タグを閉じるまでの文字列を取得しようとしています(こんにちは、imgタグの後からです)。

<a href="products.html><img src="image.jpg"  alt="alt value">hello i am from after img tag</a>

次に、それらが一致するかどうかを確認します。同時に、その行の数を調べたいと思います。Webページの行番号と行を表示する次のコードを試しました。

        $dom = new domDocument;
        $dom->loadHTMLFile('http://www.google.com');
        $dom->preserveWhiteSpace = true;
        $dom->formatOutput = true;
        $new = htmlspecialchars($dom->saveHTML(), ENT_QUOTES);
        $lines = preg_split('/\r\n|\r|\n/', $new);
        foreach ($lines as $lineNumber => $line) {
         echo $lineNumber . \r\r. $line;
        }

次のコードは、画像ソースとaltタグを提供します。「img」タグの終わりから「a」タグを閉じるまでの行番号またはテキストを取得できません(こんにちは、imgタグの後からです)。

$alts = array();
$tags = $dom->getElementsByTagName('img');
foreach($tags as $tag) {
    $alts[$tag->attributes->getNamedItem('src')->nodeValue] 
            = $tag->attributes->getNamedItem('alt')->nodeValue;
}
foreach($alts as $key => $alt) {
    echo "{$key} => {$alt}<br/>";
}

正規表現はhtml解析用ではないことは知っていますが、次の行でも正規表現が機能するかどうかを確認するためにも試してみました。$ alt ='こんにちは私はimgタグの後から来ました'私が持っている正規表現は、//alt内のすべてです

preg_match_all('|\s*alt[^>]*=[\'"](.*?)[\'"]|i', $alt, $altTag);

//「img」タグの終わりと「a」タグの終わりの間のすべて。

preg_match_all("#<\s*a[^>]*><\s*img[^>]*>(.*?)<\s*/\s*a>#s", $alt, $foo);

この方法では完璧に機能しますが、変数$ line(上記のコードから)で同じ正規表現を使用しようとすると、何も表示されません。誰か助けてくれませんか。私は本当にこの仕事をする必要があります。ありがとう

4

2 に答える 2

2

あなたの場合に正規表現を使用することは良い考えではありませんが、本当にそれを使用したい場合は、foreachループを変更する必要があります。これがコードです。

foreach ($lines as $lineNumber => $l){ 
$line= html_entity_decode($l);
}

これで、regExpを適用して必要なものを見つけることができます。

于 2013-02-21T21:41:51.530 に答える
1

それを試してみてください

$str = '<a href="products.html><img src="image.jpg"  alt="alt value">hello i am from after img tag</a>';
preg_match_all('#<a[^>]+>(.*)</a>#isU', $str, $match);
$result = array_map('strip_tags', $match[1]);
print_r($result);
于 2013-02-21T13:27:09.023 に答える