2011-09-29 15 views
0

我正在做一個鏈接和文本服務,但我有一個問題,那就是:只有1個輸入文本形式,用戶可以貼上這樣的事情: http:// asdf .com - 這將登記爲紐帶,或者因爲HTTP的「asdf http:// test .com」://,它會註冊爲網址,或 asdf - 這將註冊爲一個字符串,因爲它不包含HTTP://確定URL或字符串PHP

,但我的當用戶寫入如下內容時會出現問題: asdf http://asdf.com,它在我當前的程序中輸出「url」值。我已經經歷過了大約一個小時,現在,我已經有了一個代碼3位(!他們都被評論在同一文件中,所以請原諒我,如果他們放棄錯誤)

<? 
    $str = $_POST['paste']; 
    if(stristr($str, "http://")) { 
     $type = "url"; 
    } 
    if(stristr($str, "https://")) { 
     $type = "url"; 
    } 
    if($type!="url") { 
     $type = "string"; 
    } 
    ?> 

下一頁:

<? 
    $type = "url"; 
     if($type=="url"){ 
     $t = substr($str, 8); 
     if(stristr($t, "https://")==$t){ 
     $type = "url";} 
     if(stristr($t, "https://")==$t){ 
     $type = "url";} 
     if(stristr($t, "http://")!=$t){ 
     $type = "string";} 
     if(stristr($t, "https://")!=$t){ 
     $type = "string";} 
     } 
     echo $type; 
     ?> 

下一頁:

<?  
$url = "hasttp://cake.com"; 
    if(stristr($url, "http://")=="") { 
    $type = "string"; } else { 
    $type = "url"; 
    $sus = 1;} 
    if(stristr($url, "http://")==$url) { 
    $type = "url"; } 
    if($sus==1) { 
    $r = substr($url, 7); 
    if(stristr($r,"http://")!="http://") { 
    $type = "url"; } 
    if($r=="") { 
    $type = "string"; 
    } 
    } 
    echo $type; 
?> 

我不知道我怎麼會去一個字符串進行分類,如「asdf http://asdf.com」作爲一個字符串,而分類「asdf」作爲一個字符串,並分類「http://asdf.com'作爲網址..我還沒有嘗試過的另一個想法是strpos,但這就是我現在正在處理的內容。

任何想法?

非常感謝! :)

這個問題的某些部分由於某種原因而被切斷,致歉!

+0

你基本上是問這些:http://stackoverflow.com/search?q=linkify+php?對? – Gordon

回答

4
$type = ''; 
if (preg_match('%^https?://[^\s]+$%', $url)) { 
    $type = 'url'; 
} else { 
    $type = 'string'; 
} 

這將匹配與http://https://啓動時,並且在它不包含任何空間url類型的任何值。如果該值不是以http://https://開頭,或者其中包含空格,則它將是類型string

+0

謝謝你!完美的作品! :) – Karan

+0

爲什麼不直接使用:$ type = preg_match('%^ https?:// [^ \ s] + $%',$ url))? 'url':'string'; –

+2

@AronCederholm因爲我不想用三元運算符來嚇唬OP。你當然可以這樣做。 – Shef

0

如果我正確理解問題,您希望檢測用戶何時輸入字符串和URL並相應地解析它們中的每一個。

嘗試使用explode(" ", $userInput);,這將返回一個數組,其中包含由空格分隔的所有字符串。你可以檢查數組中的每個元素並設置類型。

+0

哈哈,那實際上並不是我的問題,但我想你只是解決了它!謝謝你的偉大答案。對不起,我的問題在於將錯誤的標籤貼在自己身上:\ – Karan

0

您應該使用正則表達式來檢查,如果字符串以http

if(preg_match('/^http/',$string_to_check)){ //this is a url }

0
$type = strpos($str, 'http') === 0 ? 'url' : 'string': 

對strpos函數返回匹配的位置在字符串中或FALSE如果沒有比賽開始。 tripple等於檢查結果不僅轉化爲0(如FALSE所做的那樣),而且它實際上也是整數(即字符串以http開頭)。

您也可以使用類似

switch (true) { 
    case strpos(trim($str), 'http://') === 0: 
    case strpos(trim($str), 'https://') === 0: 
     $type = 'url'; 
     break; 
    default: 
     $type = 'string'; 
     break; // I know this is not needed, but it is pretty :-) 
} 
1

PHP parse_url是你的函數:

在嚴重畸形的URL,parse_url()可能會返回FALSE。如果省略組件參數,則返回關聯數組。陣列中至少有一個元素存在。此陣列中的潛在密鑰爲:

  • 方案 - 例如, HTTP
  • 主機
  • 端口
  • 用戶
  • 路徑
  • 查詢 - 問號後面?
  • 片段 - 的hashmark#

如果指定了組件參數,parse_url()之後返回,而不是陣列中的字符串(或整數,在PHP_URL_PORT的情況下)。如果請求的組件不存在於給定的URL中,則將返回NULL。