2016-05-31 47 views
0

我想爲包含PDF文件的所有鏈接添加target="blank"-歸屬爲href。要做到這一點,我想在$content上做一個preg_replace,包括其中包含多個PDf鏈接的所有HTML。我覺得像這樣的工作,但遺憾的是它並不: 向所有PDF鏈接添加目標=「_ blank」

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

因此,例如下面應該發生:

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

你能幫忙我找到正確的RegEx來做到這一點?

如果有更簡單的方法來實現,我很樂意聽到它。

謝謝!

+1

當你問一個問題,請加輸入和期望輸出與實際輸出的示例。這會讓你更容易幫助你! – alfasin

回答

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(); 
+0

工程就像一個魅力,非常感謝你!我還不知道'DOMDocument()'類。 – BasC

相關問題