Ich durchlaufe einfach zweimal ein preg_match, und wenn http fehlt, schreibe ich es in den String vorher dazu. Ich denke die Lösung funktioniert. Vieleicht sollte man anschliessend zur sicherheit nochmals mit
filter_var($string, FILTER_VALIDATE_URL);
testen
$string = 'example.com';
if (preg_match('/^(http|https):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $string))
{
echo'ok';
}
elseif (preg_match('/^([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $string))
{
$string ='http://'.$string;
echo'ok';
}
else
{
echo'NO';
}