0

次のような複数の HTML リンクを含む長い文字列があります。

<a href="example.com">My Link></a>

また

<a href="http://example2.com">A different Link</a>

これらのリンクを PHP で書き直して、リダイレクタ経由でトラフィックを送信するようにする必要があります。これにより、外部ドメインに移動することをユーザーに伝えることができます。私のリダイレクタは mydomain.com/leaving.php にあります。私がやりたいのは、これらのリンクを次のように書き換えることです。

<a href="http://www.mydomain.com/leaving.php/[URL ENCODED LINK FROM ABOVE]">My Link>

すべての URL に最初から http:// があるわけではないので、最初にすべての href リンクからそれらを削除する必要があると思います。

正しい HTML リンク (画像 src を無視して) を grep し、それらを url_encode して、元の文字列に戻すにはどうすればよいですか。

編集:明確にするために、リダイレクト部分のヘルプを探しているのではなく、httpが時々ある場合に大きな文字列内の複数のURLを置き換える方法だけを探しています

4

2 に答える 2

1

正規表現を使用してXMLを編集すると、エラーが発生しやすく扱いにくくなりますが、便利なツールがあります。

HTMLを編集する最も簡単で信頼性の高い方法は、DOMとXPathを使用することです。すべてのリンクを見つけて書き直します。

おそらく、内部URLを除外するためにいくつかのフィルターを追加したいと思うでしょう。これは、XPathクエリ(処理する必要のある結果が少ないため、よりエレガントで高速になる可能性があります)またはforeachループのいずれかで実行できます。

<?php
    $html = <<< HTML
<p>
<a href="example.com">My Link>
<a href="http://example2.com">A different Link</a>
</p>
HTML;

    $dom = new DOMDocument;
    $dom->loadHTML($html);

    // Find all anchor elements containing a href attribute
    $xpath = new DOMXPath($dom);
    $anchors = $xpath->query('//a[@href]');

    // Replace all href attributes with redirection url
    foreach ($anchors as $anchor)
        // Possibly filter internal URLs?
        $anchor->setAttribute('href', 'http://www.mydomain.com/leaving.php/'.urlencode($anchor->getAttribute('href')));

    // Save html with replaced links
    $newHtml = $dom->saveXml($dom->documentElement);
?>
于 2013-01-20T22:54:54.983 に答える
1

これは、必要に応じて変更できる疑似にすぎません。

最初に、次の行を含む .htaccess ファイルが必要です。

RewriteEngine On
RewriteRule ^leaving/(.*)$ leaving.php?url=$1 [L]

そしてでleaving.php;

$url = trim(urldecode($_GET['url']));
// check url is exists
if ($url == '') {
    header('Location: http://www.mydomain.com/');
    exit;
}
// add http if needs
if (substr($url, 0, 7) != 'http://') {
    $url = 'http://'. $url;
}

// send it to target
header('Location: '. $url);
exit;

アップデート:

サーバー側でこれを試しても無駄です.PHPが出力を一度送信すると、もう使用できませpreg'sん. したがって、クライアント側でこれを行いたい場合は、次のコードなどが役立ちます。

var links = document.getElementsByTagName("a"),
    link, href, i = 0;
while (link = links[i++]) {
    // get real url applying getAttribute with "2" params
    if ((href = link.getAttribute("href", 2)) !== null
            // skip non-href links
            && href.charAt(0) !== "#") {
        // add http if not exists
        if (href.substring(0, 7) !== 'http://') {
            href = "http://"+ href
        }
        link.href = "http://www.mydomain.com/leaving/"+ href;
    }
}
于 2013-01-20T22:41:39.737 に答える