-2

リンクのプロトコルを切り替えたい。httpの場合はhttpsになり、httpsはhttpになります。pre_replaceを使用していますが、問題が発生しています。

誰かが私のコードを見て、私の思考プロセスに欠けているものを教えてもらえますか?

コードは次のとおりです。

           $pattern = array(
                0 => '/^(http\:)/',
                1 => '/^(https\:)/'
            );
            $replace = array(
                0 => 'https:',
                1 => 'http:'
            );

            ksort($pattern);
            ksort($replace);

            $url = 'http://someurl.com';

            echo $url."<br />";

            $url = preg_replace($pattern, $replace, trim($url),1);

            die($url);
4

5 に答える 5

3
  1. エスケープする必要はありません:。特殊文字ではありません。
  2. キャプチャグループは必要ありません()
  3. を呼び出す必要はありませんksort()。配列は、宣言したときにすでにキーで並べ替えられています。
  4. コードが「http」を「https」置き換え、「https」を「http」に置き換えているようです。なんで?

$url = preg_replace('/^http:/', 'https', trim($url));httpsを強制するだけの場合は、問題なく動作します。

編集

なぜ誰かが両方のhttp/httpsを同時に切り替えたいのかはまだわかりませんが、ここに行きます:

function protocol_switcheroo($url) {
  if( preg_match('/^http:/', $url) ) {
    return preg_replace('/^http:/', 'https:', $url); // http to https
  } else if( preg_match('/^https:/', $url) ) {
    return preg_replace('/^https:/', 'http:', $url); // https to http
  } else {
    return $url; // for URIs with protocols other than http/https
  }
}

問題の元のコードのように誤ってそれらを連鎖させないように、置換する呼び出しを分離する必要があります。

于 2013-03-05T16:17:38.930 に答える
1
//$url = 'http://example.com/https://www';
$url = 'https://example.com/http://www';

$url = (0 === strpos($url, 'http:'))
    ? substr_replace($url, 's:', 4, 1)
    : substr_replace($url, '', 4, 1);

echo $url;

これは変換さHTTP -> HTTPSれ、HTTPS -> HTTP

遅くなる正規表現は使用せずstr_replace()、URL の他の部分を誤って置き換える可能性のある正規表現も使用しません。最初のプレフィックスのみを置き換えます。

内訳 : URL が で始まるかどうかを確認します。5番目の文字がHTTPShttp:に置き換えられます。そうしないと、5 番目の文字が何も置き換えられず、HTTP になります。:s:s

于 2013-03-05T16:37:06.243 に答える
1

これが http -> https では機能しない (しかし https -> http では機能する) 理由は、preg_replace() が最初にキー/変数 (0) の最初のセットで http を https に変更し、その後すぐに元に戻すためです。 https -> http。これは、各配列の 2 番目の変数セット (1) が別の有効な一致であるためです。

于 2013-03-05T16:24:37.623 に答える
0

あなたが抱えている問題preg_replace()は、2つの置換を次々に実行するため、最初の置換が実行された後、2番目の置換が最初の置換の効果を逆転させることです。

両方のパターンを一緒に実行するには、1 つの式で両方のパターンを指定する必要があります。

preg_replace_callback()の代わりに使用することをお勧めしpreg_replace()ます。これにより、より複雑な出力式を記述できるため、それらを 1 つのパターンに簡単に組み合わせることができます。このような何かがトリックを行います:

$outputString = preg_replace_callback(
    '/^(http|ftp)(s)?(:)/',
    function($matches) {return $matches[1].($matches[2]=='s'?'':'s').':';},
    $inputString
);

それが役立つことを願っています。

[編集] OPによるコメントの後、/だけでなくftp/でも機能するようにコードを編集しました。ftpshttphttps

于 2013-03-05T16:43:13.057 に答える
0

URL が 2 回置き換えられています。まず、最初の式が一致して にhttp://someurl.comなりhttps://someurl.comます。次に、2 番目の式が一致して にhttps://someurl.comなりhttp://someurl.comます。

この別の例を見るとわかりやすいです:

echo preg_replace(
    array('/fox/',  '/turtle/'),
    array('turtle', 'sparrow'),
 'fox', 1);

... を出力しsparrowます。

于 2013-03-05T16:27:19.790 に答える