2010-11-30 8 views
1

私はstr_replace()を呼び出す基本的なHTMLをいくつか持っていますが、HTML文字列内に見つかったすべてのURLに 'generate_book.php?link='を追加する必要がありますが、外部リンクを除外する必要があります。特定のURLをターゲットとするPHP正規表現とは何ですか?

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

<a href="http://example.com">Link</a> - これはそのままにしなければならない

あなたの脳powaが理解されます!

答えて

1

あなたはそれがHTTPまたはHTTPSと一致していないことを確認するために最初に先読みを使用したいと思います。あなたが気になる場合は、mailtoを追加することもできます。

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

それは実際にhref="と一致しないように、この正規表現は、((?<=href=\"))ルックの後ろを使用しています。

警告:

  • あればURL schemesは、HTTPおよびHTTPS以外のHTMLにされるのを認識する必要があります。
  • linkタグのようなタグには、hrefという属性もあります。これらを置き換えていないことを確認してください。正規表現を使用してAタグだけを一致させる必要がある場合、正規表現の複雑さはかなり大きくなります。won't really be safe.
  • 正規表現の評価はずっと効率的ではありませんが、URLエンコードが必要な場合は、他の答えの2番目の戻り値のように。
  • 全体的に、正規表現は必ずしもこのための最良の解決法ではありません。あなたは、HTMLパーサーでもっと良いかもしれません...
+0

私はこのページですべての提案を試みましたが、すべてエラーが発生しています。警告:preg_replace()[function.preg-replace]:C:\ wamp \ www \ projects \ kineo \ taxteam \ [CD_COURSE]の未知の修飾子 '/' GCSB(Central)\ htdocs \ book \ generate_book.php on line 64 – danjah

+0

おっと、http/httpsの後に '/'を '\/\ /'に置き換えます。PHPを使って正規表現をテストしていないので、エスケープする必要はありませんでした。 – Nicole

+0

それは私にとって非常にうまく動作します、ありがとう、私はそれを使用している文脈で誰かを恐れたくはありませんでしたが、Server2GoパッケージはCDROMに焼き付けられているので、 ) – danjah

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); 
+0

私はかなりあなたがそこに文字列として関数を渡すことはできないと確信しています。あなたが望むのは、 'preg_replace_callback()'と 'create_function()'です(または> 5.3を使っている場合は無名関数を使います)。 – alex

+0

'e'修飾子は' replace'パラメータをPHPコードとして評価します[PHP.net PCRE修飾子](http://uk3.php.net/manual/en/reference.pcre.pattern.modifiers.php) –

+0

申し訳ありませんn00b、@alexあなたは私にあなたが意味するものの例のコードを提供してください?私は私が従うと思うが、私はまた完全な初心者です:) – danjah

関連する問題