将target =“_ blank”添加到所有PDF链接

时间:2016-05-31 16:47:26

标签: php regex replace preg-replace

我想将target="blank" - 属性添加到包含PDF文件的所有链接href。为此,我想在preg_replace$content进行preg_replace('/((<a (?=.*\.pdf)(?!.*target="_blank").*?)>)/', '$2 target="_blank">', $content); ,包括其中包含多个PDf链接的所有HTML。我觉得这样的事情会起作用,但不幸的是它没有:

$content = '<html>
<a href="http://www.example.com/file.pdf" title="File">
<a href="/file2.pdf" title="File2">
<a href="http://www.example.com/image.jpg" title="Image">
</html>';

preg_replace('/((<a (?=.*\.pdf)(?!.*target="_blank").*?)>)/', '$2 target="_blank">', $content);
    echo $content;

因此,例如,应该发生以下情况:

<html>
<a href="http://www.example.com/file.pdf" title="File" target="_blank">
<a href="/file2.pdf" title="File2" target="_blank">
<a href="http://www.example.com/image.jpg" title="Image">
</html>

应输出:

BEGIN { PROCINFO["sorted_in"] = "@ind_str_asc" }

FNR == NR { lines[$1] = $0; next }
FNR != NR { if( $1 in lines ) {
              k = $1
              # strip unnecessary key $1 from $0
              $1 = ""
              lines[ k ] = lines[ k ] $0
            }
            else lines[$1] = $0;
          }

END { for( k in lines ) print lines[ k ] }

你能帮我找到合适的RegEx吗?

如果有更简单的方法来实现同样的目标,我很乐意听到它。

谢谢!

1 个答案:

答案 0 :(得分:1)

更好且不易出错的方法是使用DOMDocumentDOMXPath。 要将target属性添加到href以.pdf结尾的所有锚点,您可以执行以下操作:

<?php
$content = '<html>
<a href="http://www.example.com/file.pdf" title="File">
<a href="/file2.pdf" title="File2">
<a href="http://www.example.com/image.jpg" title="Image">
</html>';

$doc = new DOMDocument();
$doc->loadHTML($content);
$xpath = new DOMXPath($doc);
/** @var DOMNodeList $anchors */
$anchors = $xpath->query('//a[substring(@href, string-length(@href) - 3) = ".pdf"][not(@target = "_blank")]');

/** @var DOMElement $anchor */
foreach($anchors as $anchor) {
    $anchor->setAttribute('target', '_blank');
}

echo $doc->saveHTML();