2017-07-15 33 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"); 
相關問題