1

私が呼び出しているいくつかの基本的な HTML がありstr_replace()ます。HTML 文字列内で見つかったすべての URL に「generate_book.php?link=」を追加する必要がありますが、外部リンクを除外する必要があります。

<a href="gst/3.html">Link</a> -- これは -- <a href="generate_book.php?link=gst/3.html"></a>

<a href="http://example.com">Link</a> -- これはそのままにしておく必要があります

あなたの頭脳ポワは大歓迎です!

4

2 に答える 2

1

HTTP または HTTPS と一致しないことを確認するために、最初に先読みを使用する必要があります。mailto気になる方は追加も可能です。

$str = preg_replace("/(?<=href=\")(?!http:\/\/|https:\/\/)([^\"]+)/i", "generate_book.php?link=$1", $str);

この正規表現は、(?<=href=\")実際には と一致しないように、後読み ( )も使用しますhref="

警告:

  • HTTP と HTTPS 以外に HTML に含まれるURL スキームがある場合は、そのことに注意する必要があります。
  • タグのような一部のタグには、属性linkもあります。hrefこれらを置き換えていないことを確認してください。A正規表現を使用してタグのみを一致させる必要がある場合、正規表現の複雑さが大幅に増大し、それでも実際には安全ではありません。
  • Regex Eval は効率が悪く安全ではありませんが、URL エンコードが必要な場合は、他の回答の 2 番目のリターンのように、置換時に URL エンコードを試みることができます。
  • 全体として、正規表現は必ずしもこれに対する最適なソリューションではありません。HTMLパーサーを使用したほうがよいかもしれません...
于 2010-11-30T01:31:49.680 に答える
0

これを試してください:

$str = preg_replace(
    "(href=\"([^\"]+)\")ie",
    "if(substr('$1',0,7) == 'http://')
        return stripslashes('$1');
     else
        return 'generate_book.php?link='.urlencode(stripslashes('$1'));",
    $str);
于 2010-11-30T01:21:33.367 に答える