正则表达式,以确保所有链接都具有target =" _blank"

时间:2015-06-04 14:13:24

标签: php regex html-parsing

我有一个使用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;)?

2 个答案:

答案 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解析器几乎总是更好。