2017-07-15 35 views
1

我在写一个简单的函数,它将包含url的字符串转换为可点击的链接。转换本身很简单,但是如果一个字符串包含一个协议前缀,基本验证的一部分看起来很难。字符串搜索函数返回布尔值,如果在干草堆中发现针

目前我的代码看起来是这样的:

<?php 

function link2code($link) { 
    if (stripos($link, 'http://' or 'https://' or 'ftp://' or 'ftps://') === true) { 
     return "<a href=\"$link\">$link</a>"; 
    } else { 
     echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com'); 
    } 
} 

echo link2code("http://127.0.0.1"); 

正如你可以看到我想要返回布尔值告诉如果针在干草堆。我怎样才能实现它?

+0

我不认为你可以用'或'这样。我通常使用'!== False' https://3v4l.org/ikEYT – Andreas

+0

[在strpos中使用数组作为针的可能的重复](https://stackoverflow.com/questions/6284553/using-an-array -as-needles-in-strpos) – Sean

回答

4

您可以使用preg_match为:

if(preg_match("~^(ht|f)tps?://~i", $link)) { //...etc 
+0

对于这样一个小任务,这不是一个很重的功能吗? – Andreas

+1

不是在我看来。这是一个简单的模式,所以基于正则表达式的匹配不会那么重。请注意OP代码(以及一些答案)如何不验证匹配是否在字符串的开头。 – trincot

+0

我发现这种方法是最优雅和满意的,因为我想避免使用数组。正则表达式是强大的工具。感谢您的帮助,现在代码以我想要的方式工作。 P.S.我对这个主题的答案的数量和种类印象深刻。我想在此感谢所有其他人的建议。 – spectatorx

1

你可以通过定义一个自定义函数来进行迭代,找到找到的匹配项创建一个链接。

function strPosition($haystack, $needle, $offset=0) { 
    if (!is_array($needle)) $needle = array($needle); 
    foreach ($needle as $query) { 
     if (strpos($haystack, $query, $offset) !== false) return true; // stop on first true result 
    } 
    return false; 
} 

function link2code($link) { 
    $array = array('http://', 'https://', 'ftp://', 'ftps://'); 

    $match = strPosition($link, $array); 
    if ($match == true) { 
    return "<a href=\"$link\">$link</a>"; 
    } else { 
    echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com'); 
    } 
} 
3

结账验证码:

class Test 
{ 

    public function index() 
    { 
     $link = "http://127.0.0.1"; 
     $this->checkLink("http://127.0.0.1");  //Yes 
     $this->checkLink("hsttp://127.0.0.1");  //No 
    } 

    private function checkLink($link) 
    { 
     if (stripos($link, 'http://') !== false 
      || stripos($link, 'http://') !== false 
      || stripos($link, 'ftp://') !== false 
      || stripos($link, 'ftps://') !== false) 
     { 
      echo 'Yes'; 
     } 
     else 
     { 
      echo 'No'; 
     } 
     } 

} 
1

它可以使用正则表达式来完成。 虽然使用多次stripos()也可以。 这条线会比较长,但可能会更便宜。

的可读性,我更喜欢正则表达式

<?php 

function link2code($link) { 
    if (preg_match('#^(https?|ftps?)://#i', $link)) { 
     return "<a href=\"$link\">$link</a>"; 
    } else { 
     echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com'); 
    } 
} 

echo link2code("http://127.0.0.1"); 
1

你可以尝试改写这个问题:

,而不是在链接检查,如果一个协议中,尝试检查如果链接中的协议是一个的协议:

function link2code($link) { 

    $scheme = parse_url($link, PHP_URL_SCHEME); 
    if(!in_array($scheme,['http','https','ftp','ftps']) { 
     return "<a href=\"$link\">$link</a>"; 
    } else { 
     echo() 
    } 
} 

你的问题的范围之外:

你的函数做不同的事情:

  • 它验证URL
  • 它返回字符串或它在某些情况下,它呼应返回void

您可以尝试将验证与格式分开,并确保您的函数始终返回一个字符串或引发异常。

function link2code($link) { 
    if(validateLink($link)) { 
     return "<a href=\"$link\">$link</a>"; 
    } else { 
     throw new \Exception("Please provide whole link with protocol part, for example: http://myawesomewebsite.com'"); 
    } 
} 

function validateLink($link) { 
    $scheme = parse_url($link, PHP_URL_SCHEME); 
    return in_array($scheme,['http','https','ftp','ftps']); 
} 
+0

不错,您使用'url_parse'! – trincot

0

您可以使用in_array()。
http://php.net/manual/en/function.in-array.php

function link2code($link) { 
    $arr = array('http:/', 'https:', 'ftp://', 'ftps:/'); 
    If(in_array(substr($link,0,6), $arr)){ 
     return "<a href=\"$link\">$link</a>"; 
    } else { 
     echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com'); 
    } 
} 

echo link2code("https://127.0.0.1"); 

https://3v4l.org/meI1r
该数组包含的最小字符数共同(6),这样我可以比较在函数是相同的。
所以substr会查看六个第一个字符,如果他们不匹配数组它不是唯一的链接字符串。

含义串click here https://127.0.0.1将失败

当然,如果你不需要验证,这是一个链接只有字符串可以从代码中删除SUBSTR并添加阵列中的“全”的项目。

0

正则表达式的尝试和preg_match

function link2code($link) { 
    if (! preg_match('/^(http(s)?|ftp(s)?):\/\//i', $link)) { 
     echo 'Please provide whole link with protocol part, for example: http://myawesomewebsite.com'; 
     return FALSE; 
    } 
    return sprintf('<a href="%1$s">%1$s</a>', $link); 
} 

echo link2code("http://127.0.0.1"); 
echo link2code("https://127.0.0.1");