2009-09-01 76 views
17

儘管多年來一直使用PHP,但我從來沒有真正學會如何使用表達式來正確截斷字符串......現在它在背後咬我!如何刪除標籤之間的文字在PHP?

任何人都可以提供一些幫助截斷這個嗎?我需要砍掉從URL文本部分,把

<a href="link.html">text</a> 

<a href="link.html"></a> 

回答

29
$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str) 
+0

雖然這可行,但您通常不想用正則表達式解析HTML。卡里姆的回答可能更可取。 – Konerak 2011-05-03 16:33:03

6

什麼這樣的事情,考慮到你可能要與其他href s到重新使用它:

$str = '<a href="link.html">text</a>'; 
$result = preg_replace('#(<a[^>]*>).*?(</a>)#', '$1$2', $str); 
var_dump($result); 

這將讓你:

string '<a href="link.html"></a>' (length=24) 

(我在考慮你在OP中犯了一個錯字? )


如果您不需要匹配任何其他HREF,您可以使用類似:

$str = '<a href="link.html">text</a>'; 
$result = preg_replace('#(<a href="link.html">).*?(</a>)#', '$1$2', $str); 
var_dump($result); 

這也將讓你:

string '<a href="link.html"></a>' (length=24) 


作爲sidenote:對於更復雜的HTML,不要嘗試使用正則表達式:它們適用於這種簡單的情況,但對於現實生活中的HTML部分,它們並不真正幫助l:HTML不夠「常規」「足夠」被正則表達式解析。

1

你可以結合使用子與stringpos沉綿這不是 一個非常好的方法。

檢查:PHP Manual - String functions

另一種方式是寫一個正則表達式匹配您的條件。 但爲了讓你的問題很快得到解決,字符串函數將會做...

編輯:我低估了觀衆。 ;)來吧用正則表達式... ^^

14

使用SimpleHTMLDom

<?php 
// example of how to modify anchor innerText 
include('simple_html_dom.php'); 

// get DOM from URL or file 
$html = file_get_html('http://www.example.com/'); 

//set innerText to null for each anchor 
foreach($html->find('a') as $e) { 
    $e->innerText = null; 
} 

// dump contents 
echo $html; 
?> 
+2

沒有冒犯,但這個答案是8歲,沒有人實際上已經注意到這個答案是不正確的,不起作用。簡單地回顯'$ html'時,foreach循環沒有效果。不能相信這會得到如此之多的選票,而且沒有人真正測試過它。 – 2017-08-16 17:27:11

1

僅使用strip_tags(),這將擺脫標籤和它們之間只留下所需的文本

0

你不需要自己捕獲標籤。只需定位標籤之間的文本並將其替換爲空字符串即可。超級簡單。

代碼:(Demo

$string='<a href="link.html">text</a>'; 
echo preg_replace('/<a[^>]*>\K[^<]*/','',$string); 
// the opening tag--^^^^^^^^ ^^^^^-match everything before the end tag 
//       ^^-restart fullstring match 

輸出:

<a href="link.html"></a> 

或在邊緣情況下,當鏈接文本包含<,使用此:~<a[^>]*>\K.*?(?=</a>)~

這避免的代價使用惰性量詞捕獲組,fullstring重新啓動\K和「向前」。