2011-07-21 62 views
2

我不確定如何解釋這一點,所以我會在我的代碼中顯示它。如何使用preg_replace();刪除鏈接

<a href="link.php">First</a> and 
<a href="link.php" class="delete">Second</a> and 
<a href="link.php">Third</a> 

我怎樣才能刪除開<a href="link.php" class="delete"></a>而不是其他人呢?

我在問preg_replace();,我不在尋找DomDocument或其他方法來做到這一點。我只想看看preg_replace();

上的示例如何實現?

+0

只要' ..'元素中沒有更多的HTML,那麼它就比較簡單。如果存在(或者如果可能存在)任何子元素,則它變得更加困難。 – Spudley

+5

你只想要_wrong_解決方案?沒興趣。 –

+0

好的,@Tomalak,告訴我用任何方法實現這個例子 – genesis

回答

6

只有選擇要保留組:

$pattern = '~(<a href="[^"]*" class="delete">)([^<]*)(</a>)~'; 
//     1       2  3 
$result = preg_replace($pattern, '$2', $subject); 

你找到關於preg_replace manual page更多的例子。

+2

這個問題不是[相反](http://www.ideone.com/5CRPB)嗎? –

+0

nope,它用組$ 2替換整個事物... –

+0

@genesis:你想刪除類「delete」的鏈接?沒有?這段代碼恰恰相反。 –

0
preg_replace('@<a href="[^"]+" class="delete">(.+?)</a>@', '$1', $html_string); 

明白這不是一個理想的解決是很重要的。首先,它需要在這個確切的格式中標記。其次,如果有一個嵌套的錨標籤(儘管不太可能),這會失敗。這些是爲什麼不應該使用正則表達式來解析/操作HTML的一些原因。

1
$pattern = '/<a[^<>]*?class="delete"[^<>]*?>(.*?)<\/a>/'; 

$test = '<a href="link.php">First</a> and <a href="url2.html" class="delete">Second</a> and <a href="link.php">Third</a>'; 
echo preg_replace($pattern, '$1', $test)."\n"; 

$test = '<a href="link.php">First</a> and <a href="url2.html"><b class="delete">seriously</b></a> and <a href="link.php">Third</a>'; 
echo preg_replace($pattern, '$1', $test)."\n"; 

$test = '<a href="link.php">First</a> and <a href="url2.html" class="delete"><b class="delete">seriously</b></a> and <a href="link.php">Third</a>'; 
echo preg_replace($pattern, '$1', $test)."\n"; 

$test = '<a href="link.php">First</a> and <a class="delete" href="url2.html">Second</a> and <a href="link.php">Third</a>'; 
echo preg_replace($pattern, '$1', $test)."\n"; 
4

既然你在評論中問我要如何顯示任何方法,here it is

$html =<<<HTML 
<a href="link.php">First</a> and 
<a href="link.php" class="delete">Second</a> and 
<a href="link.php">Third</a> 
HTML; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 

$elems = $xpath->query("//a[@class='delete']"); 
foreach ($elems as $elem) { 
    $elem->parentNode->removeChild($elem); 
} 

echo $dom->saveHTML(); 

請注意,saveHTML()保存完整的文檔,即使您只解析了一個片段。

從PHP 5.3.6開始,您可以添加一個$node參數來指定它應該返回的片段 - 類似$xpath->query("/*/body")[0]這樣的工作。

+0

其中5.3.6 PHP用於'$ xpath->查詢(「/ */body」)[0]'?不是5.4? – hakre

+0

@hakre:不確定你的意思 - PHP版本用XPath表達式做什麼? – Tomalak

2
$pattern = '/<a (.*?)href=[\"\'](.*?)\/\/(.*?)[\"\'](.*?)>(.*?)<\/a>/i'; 
$new_content = preg_replace($pattern, '$5', $content);