我想将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吗?
如果有更简单的方法来实现同样的目标,我很乐意听到它。
谢谢!
答案 0 :(得分:1)
更好且不易出错的方法是使用DOMDocument
和DOMXPath
。
要将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();