我有一个使用CKEditor生成HTML的textarea。我想确保用户输入的所有链接都有target="_blank"
。我认为我需要进行两次正则表达式检查:一次将target="..."
替换为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="..."
&#34;替换现有target="_parent
(例如target="_blank
&#34;)?
答案 0 :(得分:2)
您可以安全地使用带有XPATH的PHP DOM来设置属性或修改所有<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>
答案 1 :(得分:0)
略有不同的方法。
首先删除所有target="..."
项。也许用任何东西或单个空格替换\btarget="[^"]*"
。
接下来添加所需的target="_blank"
项。也许将<a
替换为<a target="_blank"
。
但要注意这些替换文件中意外位置的文本。正如对该问题的评论所说,使用适当的HTML / XML解析器几乎总是更好。