2016-10-01 128 views
0

如何將每個錨文本替換爲所有的錨點。我的代碼是preg_replace帶錨文本的href錨點

$body='<p>The man was <a href="http://www.example.com/video/">dancing like a little boy</a> while all kids were watching ... </p>'; 

我想要得到的結果是:

<p>The man was dancing like a little boy while all kids were watching ... </p> 

我用:

$body= preg_replace('#<a href="https?://(?:.+\.)?ok.co.*?>.*?</a>#i', '$1', $body); 

和結果是:

<p>The man was while all kids were watching ... </p> 
+0

當應省略號......出現?經過一定的否。的文字或字符? –

+0

正文字符串包含許多錨,我想循環它們全部檢查'www.example.com',而不是子域,用它的文本替換每個錨。謝謝 – khalil

+0

@khalil請嘗試以下通過我回答。這將解決您的問題。 – Manish

回答

0

試試這個

$body='<p>The man was <a href="http://www.example.com/video/">dancing like a little boy</a> while all kids were watching ... </p>'; 

    echo preg_replace('#<a.*?>([^>]*)</a>#i', '$1', $body); 
+0

感謝這工作取代所有的錨,但對不起,我應該提到,我不想要替換href中的子域,它應該完全匹配如果href包含「www.example.com」,而不是替換任何其他域或子域 – khalil

+0

你能用例子來解釋你想看到的嗎? – Manish

0

您可以在這裏簡單地使用strip_tags()htmlspecialchars()

用strip_tags - 地帶HTML與字符串PHP標籤

用htmlspecialchars - 轉換特殊字符爲HTML實體

第1步:使用用strip_tags()到去除除<p>標記之外的所有標記。

第2步:因爲我們需要與HTML標記一起獲得字符串,我們需要使用用htmlspecialchars()

echo htmlspecialchars(strip_tags($body, '<p>')); 

當有已經是一個內置的PHP函數,我認爲這是更好和更緊湊的使用而不是使用preg_replace

+0

對不起,我應該提到,我不想要替換href中的子域,它應該完全匹配如果href包含「www.example.com」,而不是替換任何其他域或子域 – khalil

0

可以使用此代碼:

正則表達式:/< a.*?>|<a.*?>|<\/a>/g

$body='<p>The man was <a href="http://www.example.com/video/">dancing like a little boy</a> while all kids were watching ... </p>'; 

echo preg_replace('/< a.*?>|<a.*?>|<\/a>/', ' ', $body); 

測試,並顯示例如匹配字:https://regex101.com/r/mgYjoB/1

+0

應該沒有任何空間一個有效的標籤名稱,因此' * **' – revo

1

沒有正則表達式.....

<?php 

$d = new DOMDocument(); 
$d->loadHTML('<p>The man was <a href="http://www.example.com/video/">dancing like a little boy</a> while all kids were watching ... </p>'); 
$x = new DOMXPath($d); 
foreach($x->query('//a') as $anchor){ 
    $url = $anchor->getAttribute('href'); 
    $domain = parse_url($url,PHP_URL_HOST); 
    if($domain == 'www.example.com'){ 
     $anchor->parentNode->replaceChild(new DOMText($anchor->textContent),$anchor); 
    } 
} 

function get_inner_html($node) { 
    $innerHTML= ''; 
    $children = $node->childNodes; 
    foreach ($children as $child) { 
     $innerHTML .= $child->ownerDocument->saveXML($child); 
    } 
    return $innerHTML; 
} 
echo get_inner_html($x->query('//body')[0]); 
+0

爲什麼在'$ d-> getElementsByTagName('a')'時使用XPath也是一樣的。但是,如果你註冊一個函數來檢查域名,並且如果你只選擇在你的查詢中有這個域名的鏈接節點,XPath可能會很有趣:http://php.net/manual/en/domxpath.registerphpfunctions.php –

+0

你可以當然也可以這樣使用,我只需要一個快速的非正則表達式示例,其中'XPath'是我的默認指針。儘管如此,您並不嚴格需要PHP函數:'// a [starts-with(@ href,'http://www.example.com')]'也可以用於OP,具體取決於預計是否會有類似「https:// www.example.com」或「// www.example.com」的替代方案。 – Wrikken