缺少时将http://前缀添加到URL

时间:2011-06-05 01:15:12

标签: php http html anchor href

你好我有一个非常简单的代码

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

问题是如果用户没有输入http://那么链接将指向我的网站,而不是指向外部网站。

如果用户没有输入http://并在不存在时自动添加,我如何签入PHP?

10 个答案:

答案 0 :(得分:45)

我认为你最好使用内置函数parse_url(),它返回一个带有组件的关联数组

这样的事情对你有用:

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

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

答案 1 :(得分:16)

一个简单的解决方案,可能并不适用于所有情况(即'https://'):

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

答案 2 :(得分:16)

我个人使用这个,部分取自php docs

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

答案 3 :(得分:8)

有两种方法可以解决这个问题:url解析和正则表达式。

有些人会说url解析是正确的,但正则表达式在这种情况下也能正常工作。我喜欢能够为这样的事情使用简单的单行程序,特别是因为这在模板文件中很常见,您可能需要在echo语句中使用单行来保持可读性。

正则表达式

我们可以在preg_replace的单个函数调用中执行此操作。

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

这会在字符串开头使用negative lookahead查找http://https://。如果找到任何一个,则替换不会发生。如果找不到 ,它会将http://替换为字符串的开头(0个字符),基本上将其添加到字符串中而不进行修改。

在上下文中:

<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)链接上是否存在方案。然后使用三元运算符,如果找到一个,则输出'';如果找不到,则输出'http://'。然后它将链接附加到该链接。

在上下文中:

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

答案 4 :(得分:3)

您可以使用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'];
}

答案 5 :(得分:1)

如果在字符串中找不到任何内容,则可以将此函数用作通用

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;
}

答案 6 :(得分:1)

您还可以考虑“http(s)”必须位于网址的开头:

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

答案 7 :(得分:0)

这样的东西?

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

答案 8 :(得分:0)

以下是string subtraction的另一个例子:

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

// ....

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

答案 9 :(得分:0)

我相信David's answer是执行此操作的正确方法,但可以像这样简化:

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