2015-06-04 87 views
3

我有一個使用CKEditor生成HTML的textarea。我想確保用戶輸入的所有鏈接都有他們的target="_blank"。我認爲我需要做兩個正則表達式檢查:一個替換任何target="..."target="_blank",另一個插入目標屬性,其中目標屬性不存在。我不是做多大進展:正則表達式,以確保所有鏈接都有target =「_ blank」

// where target attribute doesn't exist, add it 
preg_replace("/<a(\s*(?!target)([\w\-])+=([\\"\'])[^\\"\']+\3)*\s*\/?>/", "<a target="_blank"$1>", $input_lines); 

這個作品在這個簡單的例子:

<a href="#">one</a> ---> <a target="_blank" href="#">one</a> 

它不爲<a href="#" alt="hello">one</a>工作,我不知道爲什麼,但我通常不這樣做這對正則表達式來說很有挑戰。

此外,我將如何替換現有的target="..."(例如target="_parent「)與嚴格target="_blank」?

+4

的HTML/XML解析器可能會更好,http://php.net/manual/en/refs.xml.php。 – chris85

+0

我只是想堅持下去,在堆棧溢出所有時間的最佳答案之一:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained標籤都有效/ 1732454#1732454 – CD001

回答

2

您可以放心地使用PHP DOM使用XPath在所有<a>標籤這樣來設置屬性或修改現有的:

$html = <<<DATA 
<a href="somelink.html" target="_blank"><img src="myimage.jpg" alt="alt" title="sometitle" /></a> 
<a href="somelink1.php" target="_parent">link_no1</a> 
<a href="somelink2.php">link_no2</a> 
<a href="someimage.jpg"><img src="image2.png"></a> 
DATA; 

$dom = new DOMDocument('1.0', 'UTF-8'); 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXPath($dom); 
$links = $xpath->query('//a'); 

foreach($links as $link) { 
    $link->setAttribute('target', '_blank'); 
} 

echo $dom->saveHTML(); 

IDEONE demo

輸出:

<a href="somelink.html" target="_blank"><img src="myimage.jpg" alt="alt" title="sometitle"><a href="somelink1.php" target="_blank">link_no1</a><a href="somelink2.php" target="_blank">link_no2</a><a href="someimage.jpg" target="_blank"><img src="image2.png"></a></a> 
0

略有不同的方法。

首先刪除全部target="..."項目。也許用什麼也沒有空格替換\btarget="[^"]*"

下一個添加需要的target="_blank"項目。也許用<a target="_blank"代替<a

但要小心這些替換文件中意想不到的地方的文字。正如對問題的評論所言,使用適當的HTML/XML解析器幾乎總是更好。

相關問題