HTML の文字列があり、アンカーの href 属性に特定のリンク パターンが含まれているかどうかを確認する必要があります。それらが特定のパターンに一致する場合は、それらを変更する必要があります。
サンプルの HTML 文字列を次に示します。
<p>Disculpa, pero esta entrada está disponible sólo en <a href="http://www.example.com/static/?json=get_page&post_type=page&slug=sample-page&lang=ru">Pусский</a> y <a href="http://www.example.com/static/?json=get_page&post_type=page&sample-page&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&post_type=page&slug=sample-page&lang=ru">Pусский</a> y <a href="http://www.example.com/static/?json=get_page&post_type=page&sample-page&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 インスタンスを整理しようとしています)。