【问题标题】:Regular expression to ensure all links have target="_blank"正则表达式以确保所有链接都具有 target="_blank"
【发布时间】:2015-08-19 04:56:57
【问题描述】:

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

它不适用于&lt;a href="#" alt="hello"&gt;one&lt;/a&gt;,我不知道为什么,但我通常不会用正则表达式做这种具有挑战性的事情。

另外,我如何将现有的target="..."(例如target="_parent")替换为严格的target="_blank"?

【问题讨论】:

标签: php regex html-parsing


【解决方案1】:

您可以安全地使用带有 XPATH 的 PHP DOM 来设置属性或修改所有 &lt;a&gt; 标记中的现有属性,如下所示:

$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>

【讨论】:

    【解决方案2】:

    方法略有不同。

    首先删除所有target="..." 项。或许将 \btarget="[^"]*" 替换为空或单个空格。

    接下来添加想要的target="_blank" 项目。或许将&lt;a 替换为&lt;a target="_blank"

    但要注意文件中意外位置的这些替换文本。正如问题中的 cmets 所说,使用适当的 HTML/XML 解析器几乎总是更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2013-04-27
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多