2

HTML の文字列があり、アンカーの href 属性に特定のリンク パターンが含まれているかどうかを確認する必要があります。それらが特定のパターンに一致する場合は、それらを変更する必要があります。

サンプルの HTML 文字列を次に示します。

<p>Disculpa, pero esta entrada está disponible sólo en <a href="http://www.example.com/static/?json=get_page&amp;post_type=page&amp;slug=sample-page&amp;lang=ru">Pусский</a> y <a href="http://www.example.com/static/?json=get_page&amp;post_type=page&amp;sample-page&amp;lang=en">English</a>.</p>

したがって、問題の URL は次のパターンを取ります

http://www.example.com/static/?json=get_page&post_type=page&slug=sample-page&lang=ru

lang query 属性の値は可変です。

そのパターンに一致する href が見つかった場合は、次のように変更する必要があります。

http://www.example.com/ru/sample-page

したがって、'static' を削除して lang 属性の値に置き換える必要があり、URL の末尾に 'slug' 属性の値を追加する必要があります。

悲しいことに、私は最初のステップで困惑しているので、URL を解析して新しい値に置き換える方法をテストすることさえできていません。

    $html = '<p>Disculpa, pero esta entrada está disponible sólo en <a href="http://www.example.com/static/?json=get_page&amp;post_type=page&amp;slug=sample-page&amp;lang=ru">Pусский</a> y <a href="http://www.example.com/static/?json=get_page&amp;post_type=page&amp;sample-page&amp;lang=en">English</a>.</p>';
$dom = new DOMDocument;
    // The UTF-8 encoding is necessary
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$anchors = $dom->getElementsByTagName('a');

理論的には、この時点から、見つかったアンカーをループして何かを実行しますが、 $anchors 変数を var_dump すると、次のようになります。

object(DOMNodeList)#66 (0) { }

だから先に進めない!

DOM がアンカーの収集に失敗する原因は何ですか?

その後、アンカーに URL パターンが含まれているかどうかを最もよく特定し、それを変更して、新しく変更された HTML を返す方法に関する提案はありますか?

更新 1

そのため、var_dump が DOMNodeList の内容を表示できないようにする 5.4.1 より前の PHP バグがあることが判明しました。私は値を見つけることができます

foreach ($anchors as $anchors) {
    echo $anchors->nodeValue, PHP_EOL;
}

ただし、 $anchors オブジェクトが実際にどのように見えるかはわかりません。$anchors を解析し、最初に述べたようにそれらを変更する方法について提案があれば、それは非常に高く評価されます (私は PHP5.4.1 インスタンスを整理しようとしています)。

4

5 に答える 5

6

私は少し前に同様のことをしました。DOMNodeList を反復処理して、アンカーの href 属性を取得できます。

$dom = new DOMDocument;
$dom->loadHTML($content);
foreach ($dom->getElementsByTagName('a') as $node) {
    $original_url = $node->getAttribute('href');
    // Do something here
    $node->setAttribute('href', $var);
}
$html = $dom->saveHtml();
于 2013-07-16T05:27:45.147 に答える
0

最初にhtmlをエコーし​​てみてください。空のhtmlか何かを渡しているのかもしれません。

于 2013-07-16T04:40:13.077 に答える
0
function getLinks($link)
{
$ret=array();

$dom=new DOMDocument;

@$dom->loadHTML(file_get_contents($link));

$dom->preserveWhiteSpace=false;

$links=$dom->getElementsByTagName('a');
 $html=$dom->saveHTML();
foreach($links as $tag)
{
    @$ret[$tag->getAttribute('href')]=$tag->childNodes->item(0)->nodeValue;
}

return $ret;
}
$link="http://php.net";

 $url=getLinks($link);
于 2013-12-11T07:26:51.933 に答える
0

Hydenの答えに同意します。しかし、私はソリューションをより独立したものにしたいと考えています。DOM ドキュメントを操作しているときに、エンコーディングの問題に直面することがあります。以下に示す高度なソリューションを次に示します........

$dom = new DOMDocument;
$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
foreach ($dom->getElementsByTagName('a') as $node) {
    $original_url = $node->getAttribute('href');
    // Do something here
    $node->setAttribute('href', $var);
}
$html = $dom->saveHtml();
于 2017-11-27T08:08:54.420 に答える