web-dev-qa-db-ja.com

見つからない場合はhttp://プレフィックスをURLに追加

こんにちは、私は非常に単純なコードを持っています

<a href="'.$aProfileInfo['Website'].'" target="_self">
    <div class="callButton">Website</div>
</a>

問題は、ユーザーがhttp://を入力しない場合、リンクが外部Webサイトではなく、私のWebサイトを指すことです。

PHPユーザーがhttp://を入力していない場合にチェックインし、そこにない場合は自動的に追加するにはどうすればよいですか?

27
DiegoP.

すべてのケースで機能するとは限らない単純なソリューション(つまり、「https://」):

if (strpos($aProfileInfo['Website'],'http://') === false){
    $aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
16

組み込み関数parse_url()を使用する方がいいと思います

このような何かがあなたのために働くでしょう:

 if  ( $ret = parse_url($url) ) {

      if ( !isset($ret["scheme"]) )
       {
       $url = "http://{$url}";
       }
}
45
David

私はこれを個人的に使用していますが、これは部分的にphp docsから取得されています

$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)) {
    $link = 'http://' . ltrim($link, '/');
}
16
Satbir Kira

この問題に対処するには、URL解析と正規表現の2つの方法があります。

URL解析はrightであると言う人もいますが、この場合は正規表現も同様に機能します。これは特に、読みやすさを維持するためにエコーステートメント内にワンライナーが必要になる可能性があるテンプレートファイルでよくあることなので、このようなことのためにシンプルなワンライナーを使用できることが好きです。

正規表現

preg_replace を使用した単一の関数呼び出しでこれを行うことができます。

_preg_replace('/^(?!https?:\/\/)/', 'http://', $aProfileInfo['Website'])
_

これは、_negative lookahead_または_http://_を検索する文字列の先頭に_https://_を使用します。どちらかが見つかった場合、置換は行われません。それらが見つからない場合は、文字列(0文字)の先頭を_http://_に置き換えます。それ。

コンテキスト:

_<a href="'. preg_replace('/^(?!https?:\/\/)/', 'http://', $aProfileInfo['Website']).'" target="_self">
    <div class="callButton">Website</div>
</a>
_

URL解析

_(parse_url($aProfileInfo['Website'], PHP_URL_SCHEME) ? '' : 'http://') . $aProfileInfo['Website']
_

これが行うことは、スキームがparse_url($aProfileInfo['Website'], PHP_URL_SCHEME)を通じてリンクに存在するかどうかを確認することです。次に、3項演算子を使用して、見つかった場合は_''_を、見つからなかった場合は_'http://'_を出力します。次に、その上にリンクを追加します。

コンテキスト:

_<a href="'.((parse_url($aProfileInfo['Website'], PHP_URL_SCHEME) ? '' : 'http://') . $aProfileInfo['Website']).'" target="_self">
    <div class="callButton">Website</div>
</a>
_
8
Evan Kennedy

strpos を使用できます:

// Trim trailing whitespace
$aProfileInfo['Website'] = trim($aProfileInfo['Website']);

// Test if the string begins with "http://"
if (strpos($aProfileInfo['Website'], 'http://') !== 0) {
  $aProfileInfo['Website'] = 'http://' . $aProfileInfo['Website'];
}
3
kevinji

「http(s)」がURLの先頭にある必要があることも考慮に入れることができます。

if (preg_match('/^https?:\/\//', $aProfileInfo['Website']) === 0) {
    $aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
1
ggonzal

この関数は一般的なものとして使用できます配列から何も文字列に見つからない場合何かを追加します。

function httpify($link, $append = 'http://', $allowed = array('http://', 'https://')){

  $found = false;
  foreach($allowed as $protocol)
    if(strpos($link, $protocol) !== 0)
      $found = true;

  if($found)
    return $link;
  return $append.$link;
}
1
Hailwood

string subtraction を使用した別の例を次に示します。

$changeLink = $myRow->site_url;
  if(substr($changeLink, 0, 7) != 'http://') {
     $changeLink = 'http://' . $changeLink;  
}

// ....

echo "<a href=\"" . $changeLink . "\" target=\"_blank\"></a>";
0
Porta Shqipe

私は Davidの答え がこれを行う適切な方法であると信じていますが、次のように簡略化できます。

parse_url($aProfileInfo['Website'], PHP_URL_SCHEME)==''?'http://'.$aProfileInfo['Website']:$aProfileInfo['Website']
0
Nate

このようなもの?

if (!strpos($aProfileInfo['Website'], 'http://')) {
    $aProfileInfo['Website'] = 'http://' . $aProfileInfo['Website'];
}
0
gpresland