2009-07-11 16 views
11

Wenn ich eine Zeichenfolge, die eine URL enthält (Beispiele willen, werden wir nennen es url $) wie;PHP Remove URL aus string

$url = "Here is a funny site http://www.tunyurl.com/34934"; 

Wie entferne ich die URL aus der Zeichenfolge? Schwierigkeit ist, URLs können auch ohne http: //, wie z.

$url = "Here is another funny site www.tinyurl.com/55555"; 

Es ist kein HTML vorhanden. Wie würde ich eine Suche starten, wenn http oder www existiert, dann entfernen Sie den Text/Zahlen/Symbole bis zum ersten Leerzeichen?

+0

Sprechen wir über URLs von Strings EXTRAHIERUNG oder das Entfernen von Ist der Link selbst? $ url = "Hier ist eine andere lustige Seite www.tinyurl.com/55555"; (Extrahieren) $ url = "Hier ist eine andere lustige Seite www.tinyurl.com/55555"; und $ someVar = 'www.tinyurl.com/55555'; (Entfernen) $ url = "Hier ist eine andere lustige Seite"; – tomzx

Antwort

35

ich die Frage erneut zu lesen, hier ist eine Funktion, wie beabsichtigt funktionieren würde:

function cleaner($url) { 
    $U = explode(' ',$url); 

    $W =array(); 
    foreach ($U as $k => $u) { 
    if (stristr($u,'http') || (count(explode('.',$u)) > 1)) { 
     unset($U[$k]); 
     return cleaner(implode(' ',$U)); 
    } 
    } 
    return implode(' ',$U); 
} 

$url = "Here is another funny site www.tinyurl.com/55555 and http://www.tinyurl.com/55555 and img.hostingsite.com/badpic.jpg"; 
echo "Cleaned: " . cleaner($url); 

Edit # 2/# 3 (Ich muss gebohrt werden). Hier ist eine Version, die es überprüft, ist eine TLD innerhalb der URL:

function containsTLD($string) { 
    preg_match(
    "/(AC($|\/)|\.AD($|\/)|\.AE($|\/)|\.AERO($|\/)|\.AF($|\/)|\.AG($|\/)|\.AI($|\/)|\.AL($|\/)|\.AM($|\/)|\.AN($|\/)|\.AO($|\/)|\.AQ($|\/)|\.AR($|\/)|\.ARPA($|\/)|\.AS($|\/)|\.ASIA($|\/)|\.AT($|\/)|\.AU($|\/)|\.AW($|\/)|\.AX($|\/)|\.AZ($|\/)|\.BA($|\/)|\.BB($|\/)|\.BD($|\/)|\.BE($|\/)|\.BF($|\/)|\.BG($|\/)|\.BH($|\/)|\.BI($|\/)|\.BIZ($|\/)|\.BJ($|\/)|\.BM($|\/)|\.BN($|\/)|\.BO($|\/)|\.BR($|\/)|\.BS($|\/)|\.BT($|\/)|\.BV($|\/)|\.BW($|\/)|\.BY($|\/)|\.BZ($|\/)|\.CA($|\/)|\.CAT($|\/)|\.CC($|\/)|\.CD($|\/)|\.CF($|\/)|\.CG($|\/)|\.CH($|\/)|\.CI($|\/)|\.CK($|\/)|\.CL($|\/)|\.CM($|\/)|\.CN($|\/)|\.CO($|\/)|\.COM($|\/)|\.COOP($|\/)|\.CR($|\/)|\.CU($|\/)|\.CV($|\/)|\.CX($|\/)|\.CY($|\/)|\.CZ($|\/)|\.DE($|\/)|\.DJ($|\/)|\.DK($|\/)|\.DM($|\/)|\.DO($|\/)|\.DZ($|\/)|\.EC($|\/)|\.EDU($|\/)|\.EE($|\/)|\.EG($|\/)|\.ER($|\/)|\.ES($|\/)|\.ET($|\/)|\.EU($|\/)|\.FI($|\/)|\.FJ($|\/)|\.FK($|\/)|\.FM($|\/)|\.FO($|\/)|\.FR($|\/)|\.GA($|\/)|\.GB($|\/)|\.GD($|\/)|\.GE($|\/)|\.GF($|\/)|\.GG($|\/)|\.GH($|\/)|\.GI($|\/)|\.GL($|\/)|\.GM($|\/)|\.GN($|\/)|\.GOV($|\/)|\.GP($|\/)|\.GQ($|\/)|\.GR($|\/)|\.GS($|\/)|\.GT($|\/)|\.GU($|\/)|\.GW($|\/)|\.GY($|\/)|\.HK($|\/)|\.HM($|\/)|\.HN($|\/)|\.HR($|\/)|\.HT($|\/)|\.HU($|\/)|\.ID($|\/)|\.IE($|\/)|\.IL($|\/)|\.IM($|\/)|\.IN($|\/)|\.INFO($|\/)|\.INT($|\/)|\.IO($|\/)|\.IQ($|\/)|\.IR($|\/)|\.IS($|\/)|\.IT($|\/)|\.JE($|\/)|\.JM($|\/)|\.JO($|\/)|\.JOBS($|\/)|\.JP($|\/)|\.KE($|\/)|\.KG($|\/)|\.KH($|\/)|\.KI($|\/)|\.KM($|\/)|\.KN($|\/)|\.KP($|\/)|\.KR($|\/)|\.KW($|\/)|\.KY($|\/)|\.KZ($|\/)|\.LA($|\/)|\.LB($|\/)|\.LC($|\/)|\.LI($|\/)|\.LK($|\/)|\.LR($|\/)|\.LS($|\/)|\.LT($|\/)|\.LU($|\/)|\.LV($|\/)|\.LY($|\/)|\.MA($|\/)|\.MC($|\/)|\.MD($|\/)|\.ME($|\/)|\.MG($|\/)|\.MH($|\/)|\.MIL($|\/)|\.MK($|\/)|\.ML($|\/)|\.MM($|\/)|\.MN($|\/)|\.MO($|\/)|\.MOBI($|\/)|\.MP($|\/)|\.MQ($|\/)|\.MR($|\/)|\.MS($|\/)|\.MT($|\/)|\.MU($|\/)|\.MUSEUM($|\/)|\.MV($|\/)|\.MW($|\/)|\.MX($|\/)|\.MY($|\/)|\.MZ($|\/)|\.NA($|\/)|\.NAME($|\/)|\.NC($|\/)|\.NE($|\/)|\.NET($|\/)|\.NF($|\/)|\.NG($|\/)|\.NI($|\/)|\.NL($|\/)|\.NO($|\/)|\.NP($|\/)|\.NR($|\/)|\.NU($|\/)|\.NZ($|\/)|\.OM($|\/)|\.ORG($|\/)|\.PA($|\/)|\.PE($|\/)|\.PF($|\/)|\.PG($|\/)|\.PH($|\/)|\.PK($|\/)|\.PL($|\/)|\.PM($|\/)|\.PN($|\/)|\.PR($|\/)|\.PRO($|\/)|\.PS($|\/)|\.PT($|\/)|\.PW($|\/)|\.PY($|\/)|\.QA($|\/)|\.RE($|\/)|\.RO($|\/)|\.RS($|\/)|\.RU($|\/)|\.RW($|\/)|\.SA($|\/)|\.SB($|\/)|\.SC($|\/)|\.SD($|\/)|\.SE($|\/)|\.SG($|\/)|\.SH($|\/)|\.SI($|\/)|\.SJ($|\/)|\.SK($|\/)|\.SL($|\/)|\.SM($|\/)|\.SN($|\/)|\.SO($|\/)|\.SR($|\/)|\.ST($|\/)|\.SU($|\/)|\.SV($|\/)|\.SY($|\/)|\.SZ($|\/)|\.TC($|\/)|\.TD($|\/)|\.TEL($|\/)|\.TF($|\/)|\.TG($|\/)|\.TH($|\/)|\.TJ($|\/)|\.TK($|\/)|\.TL($|\/)|\.TM($|\/)|\.TN($|\/)|\.TO($|\/)|\.TP($|\/)|\.TR($|\/)|\.TRAVEL($|\/)|\.TT($|\/)|\.TV($|\/)|\.TW($|\/)|\.TZ($|\/)|\.UA($|\/)|\.UG($|\/)|\.UK($|\/)|\.US($|\/)|\.UY($|\/)|\.UZ($|\/)|\.VA($|\/)|\.VC($|\/)|\.VE($|\/)|\.VG($|\/)|\.VI($|\/)|\.VN($|\/)|\.VU($|\/)|\.WF($|\/)|\.WS($|\/)|\.XN--0ZWM56D($|\/)|\.XN--11B5BS3A9AJ6G($|\/)|\.XN--80AKHBYKNJ4F($|\/)|\.XN--9T4B11YI5A($|\/)|\.XN--DEBA0AD($|\/)|\.XN--G6W251D($|\/)|\.XN--HGBK6AJ7F53BBA($|\/)|\.XN--HLCJ6AYA9ESC7A($|\/)|\.XN--JXALPDLP($|\/)|\.XN--KGBECHTV($|\/)|\.XN--ZCKZAH($|\/)|\.YE($|\/)|\.YT($|\/)|\.YU($|\/)|\.ZA($|\/)|\.ZM($|\/)|\.ZW)/i", 
    $string, 
    $M); 
    $has_tld = (count($M) > 0) ? true : false; 
    return $has_tld; 
} 

function cleaner($url) { 
    $U = explode(' ',$url); 

    $W =array(); 
    foreach ($U as $k => $u) { 
    if (stristr($u,".")) { //only preg_match if there is a dot  
     if (containsTLD($u) === true) { 
     unset($U[$k]); 
     return cleaner(implode(' ',$U)); 
    }  
    } 
    } 
    return implode(' ',$U); 
} 


$url = "Here is another funny site badurl.badone somesite.ca/worse.jpg but this badsite.com www.tinyurl.com/55555 and http://www.tinyurl.com/55555 and img.hostingsite.com/badpic.jpg"; 
echo "Cleaned: " . cleaner($url); 

kehrt:

Cleaned: Here is another funny site badurl.badone but this and and 
+1

süß! Ich liebe Kopieren einfügen Code, der einfach funktioniert :) – GeoffreyF67

+0

Vielen Dank für die Zeit nehmen, um auf diese zu erweitern. – mrpatg

+0

Sollte "this and and" blau sein? Ich möchte die tatsächliche Ausgabe nicht bearbeiten ;-) –

-1

Sie müßten einen regulären Ausdruck schreiben, um die URLs zu extrahieren.

3

Parsing Text für URLs ist hart und suchen nach vorbestehenden, stark getestet Code, der tut dies bereits denn du wärst besser als deinen eigenen Code und fehlende Randfälle zu schreiben. Zum Beispiel würde ich einen Blick auf den Prozess in Djangos urlize werfen, der URLs in Ankern umschließt. Sie können es auf PHP portieren und - anstatt URLs in einen Anker einzufügen - löschen Sie sie einfach aus dem Text.

6
$string = preg_replace('/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i', '', $string); 
0

dank mike,

Update ein wenig, es Ankündigung Fehler zurück,

'/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i'

$string = preg_replace('/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i', '', $string);

0
$url = "Here is a funny site http://www.tunyurl.com/34934"; 
$replace = 'http www .com .org .net'; 
$with = ''; 

$clean_url = clean($url,$replace,$with); 
echo $clean_url; 

function clean($url,$replace,$with) { 

    $replace = explode(" ",$replace); 
    $new_string = ''; 
    $check = explode(" ",$url); 

    foreach($check AS $key => $value) { 
    foreach($replace AS $key2 => $value2) { 
     if (-1 < strpos(strtolower($value), strtolower($value2)) ) { 
      $value = $with; 
      break; 
     } 
    } 
    $new_string .= " ".$value; 
    } 
return $new_string; 
} 
+0

Könnten Sie Ihrem Code eine Erläuterung geben? Es könnte OP oder zukünftigen Benutzern mehr helfen. – Bono