2015-06-04 131 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解析器几乎总是更好。

相关问题