Hello I have a very simple code
<a href="'.$aProfileInfo['Website'].'" target="_self">
<div class="callButton">Website</div>
</a>
The problem is that if the user does not enter http:// the link will then point to my website and not to the external website as it should.
How do I check in PHP if the user has not entered http:// and automatically add it when it is not there?
A simple solution which may not work in all cases (i.e. 'https://'):
if (strpos($aProfileInfo['Website'],'http://') === false){
$aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
I think you'd better use the built in function parse_url()
which returns an associative array with its components
something like this will work for you:
if ( $ret = parse_url($url) ) {
if ( !isset($ret["scheme"]) )
{
$url = "http://{$url}";
}
}
I personally use this, which is partially taken from php docs
$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)) {
$link = 'http://' . ltrim($link, '/');
}
There are two ways of tackling this problem: url parsing and regular expressions.
Some will say url parsing is right, but regular expressions work just as well in this case. I like being able to have simple one-liners for things like this especially because this would be a common occurrence in template files where you may need a one-liner inside an echo statement to maintain readability.
Regular Expressions
We can do this in a single function call with preg_replace.
preg_replace('/^(?!https?:\/\/)/', 'http://', $aProfileInfo['Website'])
This uses a negative lookahead
at the beginning of the string that looks for http://
or https://
. If either are found, the replace doesn't happen. If they aren't found, it replaces the beginning of the string (0 characters) with http://
essentially prepending this to the string without modifying it.
In context:
<a href="'. preg_replace('/^(?!https?:\/\/)/', 'http://', $aProfileInfo['Website']).'" target="_self">
<div class="callButton">Website</div>
</a>
URL Parsing
(parse_url($aProfileInfo['Website'], PHP_URL_SCHEME) ? '' : 'http://') . $aProfileInfo['Website']
What this does is find out if a scheme is present on the link throught parse_url($aProfileInfo['Website'], PHP_URL_SCHEME)
. Then using a ternary operator, it will either output ''
if there was one found or 'http://'
if one wasn't found. Then it appends the link onto that.
In context:
<a href="'.((parse_url($aProfileInfo['Website'], PHP_URL_SCHEME) ? '' : 'http://') . $aProfileInfo['Website']).'" target="_self">
<div class="callButton">Website</div>
</a>
You could use 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'];
}
You can use this function as a general if nothing from the array is found in the string append something to it.
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;
}
You also may take into account that "http(s)" must be at the beginning of the url:
if (preg_match('/^https?:\/\//', $aProfileInfo['Website']) === 0) {
$aProfileInfo['Website'] = 'http://'.$aProfileInfo['Website'];
}
Something like this?
if (!strpos($aProfileInfo['Website'], 'http://')) {
$aProfileInfo['Website'] = 'http://' . $aProfileInfo['Website'];
}
Here is another example with string subtraction:
$changeLink = $myRow->site_url;
if(substr($changeLink, 0, 7) != 'http://') {
$changeLink = 'http://' . $changeLink;
}
// ....
echo "<a href=\"" . $changeLink . "\" target=\"_blank\"></a>";
I believe David's answer is the proper way to do this, but it can be simplified like this:
parse_url($aProfileInfo['Website'], PHP_URL_SCHEME)==''?'http://'.$aProfileInfo['Website']:$aProfileInfo['Website']