2017-02-02 3 views
1

Hier passend ist der Code iregex für http und www Urls in einer PHP-String

function parseURL($text) { 
    $regex = "#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#iS"; 
    preg_match_all($regex, $text, $matches); 
    foreach($matches[0] as $pattern){ 
     $text = str_replace($pattern, "<a href=\"$pattern\" target=\"_blank\">$pattern</a> ", $text); 
    } 
    return $text; 
} 

meine regex Aus irgendeinem Grund bin mit, die die folgenden Ergebnisse ausgibt: (fett = verknüpft)

www.domain.com

http: // www.domain.com

Weiter

http://domain.com

so funktioniert es gut, außer wenn es enthält sowohl http und www an welcher Stelle es nur aus dem www Teil verbindet.

irgendeine idee warum?

EDIT

Für alle, die dies lesen Sie das Update erforderlich ist, ist hier die Arbeits Code dank Wiktor Stribiżew ..

function parseURL($text) { 
    $regex = "@\b(([\w-]+://?|www[.])[^\s()<>]+(?:\(\w+\)|([^[:punct:]\s]|/)))@i"; 
    $subst = "<a href='$0' target='_blank'>$0</a>"; 
    $text = preg_replace($regex, $subst, $text); 
    return $text; 
} 
+0

Warum Sie ersetzen Streichhölzer? Verwenden Sie einfach 'preg_replace' direkt. Auch "S" macht hier keinen Sinn (auch wenn Sie 's', DOTALL) verwenden wollten. Siehe [diese PHP-Demo] (https://ideone.com/5hj7fX). –

+1

Gibt es einen Grund, warum Sie http://php.net/manual/en/function.parse-url.php nicht verwenden? – Oliver

+0

@Anant, wenn es mehr als eine URL in der $ Textzeichenfolge gibt – FoxyFish

Antwort

1

Sie müssen Streichhölzer nicht zuerst sammeln und dann ersetzen Sie jedes einzeln. Verwenden Sie direkt preg_replace und verwenden Sie eine $0 Rückverweisung, um sich auf das gesamte Match vom Ersatzmuster zu beziehen.

anzeigen PHP demo:

$re = '@\b(([\w-]+://?|www[.])[^\s()<>]+(?:\(\w+\)|([^[:punct:]\s]|/)))@i'; 
$str = "www.domain.com\nhttp://www.domain.com\nhttp://domain.com"; 
$subst = '<a href="$0" target="_blank">$0</a> '; 
$result = preg_replace($re, $subst, $str); 
echo $result; 

Ausgang:

<a href="www.domain.com" target="_blank">www.domain.com</a> 
<a href="http://www.domain.com" target="_blank">http://www.domain.com</a> 
<a href="http://domain.com" target="_blank">http://domain.com</a> 
Verwandte Themen