2013-12-16 38 views
0

我只是做了更換鏈接到HTML錨標記一個正則表達式,這是它:檢查正則表達式模式是正確的

~((http\:\/\/|https\:\/\/)([^ ]+)) ~ 

爲什麼我問這個的原因,是因爲我剛做完這個正則表達式最近和用一些鏈接做了一些測試,但它工作的很好,但我想確保這種模式沒有錯誤(我是一個正則表達式newie),也許正則表達式專家可以告訴他的意見和/或建議。順便說一句,如果你在最後找出空格,如果字符串沒有以空格結束,你可能會認爲它不起作用,但我的訣竅是在將字符串添加到字符串之前替換,然後再刪除一次的東西完成後。

PD:

我不照顧鏈接的有效性本身,我只是想搜索以http開頭字符串://,並用空格,沒有別的結束,因爲鏈接驗證有點複雜。

編輯:

我的一些代碼:

<?php 

    $patron = "~(https?:\/\/[^\s]+) ~"; 
    //$patron = "~((http\:\/\/|https\:\/\/)([^ ]+)) ~"; 
    $reemplazar = '<a href="$1">$1</a> '; 
    $cadena = "https://www.youtube.com/watch?v=7it5wioGixA "; 

    echo preg_replace($patron, $reemplazar, $cadena); 

?> 
+0

谷歌搜索「正則表達式測試儀」 – Donovan

+0

@Donovan我做到了,我用它,現在我想試試「StackOverflow的專家測試儀」 :-) – Neo

+1

這不是真的是這個網站的目的是對,你不實際上有一個問題,你正在尋找意見。 – Donovan

回答

2

我認爲這是可以大大簡化:

~(https?://\S+) ~ 

除此之外:看起來不錯給我。

+0

您是否正確驗證了[^ \ s]的https? – Neo

+0

不,我通過問號將「https」中的「s」標記爲可選項。 '[^ \ s]'僅僅意味着「除了任何形式的空白之外的所有字符」。 – DaSourcerer

+1

而'[^ \ s] +'也可以簡化爲'\ S +' – Toto

1

有了同樣的想法,你的模式可以被縮短到:

~https?://[^\s"'>]+~ # don't forget to escape the quote you use. 

要更改的URL鏈接:

$html = preg_replace_callback('~\b(?:(https?://)|www\.)[^]\s"\')<]++~', 
    function ($m) { 
     $pre = ($m[1]) ? $m[1] : 'http://'; 
     if (filter_var($pre . $m[0], FILTER_VALIDATE_URL)) 
      return '<a href="' . $m[0] . '">' . $m[0] . '</a>'; 
     else return $m[0]; 
    }, $html); 

老答案:

要改變內部鏈接網址:

從所有「a」標籤中提取所有href屬性的更好方法是使用DOM。

$doc = new DOMDocument(); 
@$doc->loadHTML($htmlString); 
$links = $doc->getElementsByTagName('href'); 
foreach($links as &$link) { 
    $href = $link->getAttribute('href'); 
    $link->setAttribute('href', 'what you want'); 
} 
+0

我不想提取錨點的href,我想將鏈接轉換爲錨點.. – Neo

+0

@Neo:在這種情況下,它會更復雜,因爲URL並不總是一個協議! –

+0

該鏈接的主要要求是它至少包含協議,它非常簡單。 – Neo