2016-07-11 8 views
0

可能であれば、httpであればいつでもURLをhttpsで他のドメインの画像に置き換える必要があります。問題は、すべての外部ドメインがhttpsをサポートしているわけではないため、httpsの代わりにhttpを置き換えることができないということです。文字列のhttpsのhttpをPHPの特定のドメインのみに置き換える方法

私はhttpsで動作することがわかっているドメインのリストでこれを行いたいと思います。

wwwがある場合、検索はドメインとは無関係に機能する必要があります。追加されているかどうか。

@Wiktorの例を使用すると、私は必要なものに近いものを持っていますが、このコードが現在機能しているときに一致が見つからないときには置換を実行するために、これを取り消す必要があります。

/http(?!:\/\/(?:[^\/]+\.)?(?:example\.com|main\.com)\b)/i 
+3

*正規表現については、サンプル入力がなく、出力がありません。何かが正しくない... * – revo

+0

正規表現を使用しないでください。正規表現がこれを適切に処理できると期待するには、あまりにも多くの要件があります。 – nickb

+0

https://ideone.com/a6Eb2rを参照してください。 –

答えて

1

は、私はあなたがIDEONE demo

正規表現マッチを参照してください

$domains = array("example.com", "main.com"); 
$s = "http://example.com http://main.main.com http://let.com"; 
$re = '/http(?=:\/\/(?:[^\/]+\.)?(?:' 
     . implode("|", array_map(function ($x) { 
      return preg_quote($x); 
      }, $domains)) 
     . ')\b)/i'; 
echo preg_replace($re, "https", $s); 
// => https://example.com https://main.main.com http://let.com 

を使用することができると信じて:

  • httpからhttp
  • ...が続いた場合にのみ0 - 正の先読みの開始
    • :\/\/から://リテラルストリング
    • (?:[^\/]+\.)? - /以外の文字1+の任意の配列と.
    • (?: + implodeコードは - 個々のリテラルエスケープ交替グループを作成ブランチ(いずれかの選択肢に一致するように、exampleまたはmainなど)
    • ) - 代替グループの末尾
  • \b - ワード境界
  • ) - 先読み
  • /iの終わり - 場合insenstive修飾子。
+1

ありがとう@WiktorStribiżew! – AdamJones

関連する問題