2016-03-26 31 views
0

Ich schrieb diese Funktion, um alle spezifischen URLs (mywebsite.com) in Links zu konvertieren und andere URLs zu @@@ spam @@@ zu streichen.PHP regex spezifische URL und andere Streifen

function get_global_convert_all_urls($content) { 
    $content = strtolower($content); 
    $replace = "/(?:http|https)?(?:\:\/\/)?(?:www.)?(([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.[A-Za-z]+)(?:\/.*)?/im"; 
    preg_match_all($replace, $content, $search); 
    $total = count($search[0]); 
    for($i=0; $i < $total; $i++) { 
    $url = $search[0][$i]; 
    if(preg_match('/mywebsite.com/i', $url)) { 
     $content = str_replace($url, '<a href="'.$url.'">'.$url.'</a>', $content);    
    } else { 
     $content = str_replace($url, '@@@[email protected]@@', $content); 
    } 
    } 

    return $content; 
} 

Das einzige Problem, das ich nicht lösen kann, ist, die Regex endet nicht im Leerzeichen, wenn 2 URLs in einer Zeile.

$content = "http://www.mywebsite.com/index.html http://www.others.com/index.html"; 

Ergebnis:

<a href="http://www.mywebsite.com/index.html http://www.others.com/index.html">http://www.mywebsite.com/index.html http://www.others.com/index.html</a> 

Wie kann ich das Ergebnis unten erhalten:

<a href="http://www.mywebsite.com/index.html">http://www.mywebsite.com/index.html</a> @@@[email protected]@@ 

ich dies versucht haben, fügen Sie (\ s | $) am Ende der Regex aber kein Glück :

/(?:http|https)?(?:\:\/\/)?(?:www.)?(([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.[A-Za-z]+)(?:\/.*)?(\s|$)/im 
+0

Ich denke, die Verbindung oben 'href =" http: //www.http://www.mywebsite.com "' ist auch falsch – RomanPerekhrest

+0

komisch ... Ich erhalte dieses Ergebnis 'http://www.mywebsite.com @@@ spam @@@ '' mit Ihrem aktuellen Regex – RomanPerekhrest

+0

@RomanPerekhrest Oppsss ... Entschuldigung, bitte versuchen Sie hinzuzufügen /index.h tml – richard

Antwort

1

Bearbeitet basierend auf Änderung in Ihrer Frage.

Das Problem ist Ihre. * Am Ende Ihrer Regex, so ist mein Vorschlag, es durch einen präziseren Ausdruck zu ersetzen. Ich habe das sehr schnell durchgearbeitet, Sie werden einige Tests durchführen müssen, um Ihre Fälle zu verifizieren. =)

$matches = null; 
$returnValue = preg_match_all('!(?:http|https)?(?:\\:\\/\\/)?(?:www.)?(([A-Za-z0-9-]+\\.)*[A-Za-z0-9-]+\\.[A-Za-z]+)(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\\-\\._\\?\\,\\\'/\\\\\\+&%\\$#\\=~])*[^\\.\\,\\)\\(]!', 'mywebsite.com/index.html others.com/index.html', $matches); 

Ergebnisse in:

array (
    0 => 
    array (
    0 => 'mywebsite.com/index.html ', 
    1 => 'others.com/index.html', 
), 
    1 => 
    array (
    0 => 'mywebsite.com', 
    1 => 'others.com', 
), 
    2 => 
    array (
    0 => '', 
    1 => '', 
), 
    3 => 
    array (
    0 => '', 
    1 => '', 
), 
    4 => 
    array (
    0 => 'l', 
    1 => 'm', 
), 
) 
+0

Oppsss ... Sorry, bitte versuchen Sie /index.html auf beiden URLs hinzuzufügen. – richard

+0

Danke! es funktionierte. – richard

1

Ändern Sie das letzte Element der Regex (?:\/.*)? in \S*.

Ihre Regex entspricht jedem Zeichen bis zum Ende der Zeichenfolge einschließlich Leerzeichen, \S* entspricht jedem Zeichen, das kein Leerzeichen ist.

könnte Sie vereinfacht auch die ganze Regex in:

$replace = "~(?:https?://)?(?:www\.)?(([A-Z0-9-]+\.)*[A-Z0-9-]+\.[A-Z]+)\S*~im"; 
+0

Danke! es hat auch funktioniert. – richard

1

Ändern des regexp Muster den letzten Abschnitt URL (/index.html, /index.php) zu erfassen.

/(?:http|https)?(?:\:\/\/)?(?:www.)?(([A-Za-z0-9-]+?\.)?[A-Za-z0-9-]+?\.?[A-Za-z]*?(\/\w+?\.\w+?)?)\b/im 

Ihre Funktion Inhalt ändern, wie unten dargestellt:

$content = "http://www.mywebsite.com/index.html http://www.others.com/index.html"; 

function get_global_convert_all_urls($content) { 
    $content = strtolower($content); 
    $replace = "/(?:http|https)?(?:\:\/\/)?(?:www.)?(([A-Za-z0-9-]+?\.)?[A-Za-z0-9-]+?\.?[A-Za-z]*?(\/\w+?\.\w+?)?)\b/im"; 
    preg_match_all($replace, $content, $search); 

    foreach ($search[0] as $url) { 
    if(preg_match('/mywebsite.com/i', $url)) { 
     $content = str_replace($url, '<a href="'.$url.'">'.$url.'</a>', $content);   
    } else { 
     $content = str_replace($url, '@@@[email protected]@@', $content); 
    } 
    } 

    return $content; 
} 

var_dump(get_global_convert_all_urls($content)); 

Der Ausgang:

string '<a href="http://www.mywebsite.com/index.html">http://www.mywebsite.com/index.html</a> @@@[email protected]@@' 
+0

Danke! es hat auch funktioniert. – richard