2011-11-28 172 views
1

我有這樣的正則表達式替換(它是由PHPBB源代碼獲得)。PHP正則表達式替換鏈接

$match = array(
       '#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+")?href="(.*?)" target\=\"_blank\">.*?</a><!\-\- \1 \-\->#', 
       '#<!\-\- .*? \-\->#s', 
       '#<.*?>#s', 
      ); 
$replace = array('\2', '', ''); 

$message = preg_replace($match, $replace, $message); 

如果我通過消息運行它像這樣

asdfafdsfdfdsfds 
<!-- m --><a class="postlink" href="http://website.com/link-is-looooooong.txt">http://website.com/link ... oooong.txt</a><!-- m --> 
asdfafdsfdfdsfds4324 

它返回

asdfafdsfdfdsfds 
http://website.com/link ... oooong.txt 
asdfafdsfdfdsfds4324 

不過,我想將它做成一個替換功能。所以我可以通過提供href來替換塊中的鏈接標題。

我想提供的URL,新的URL和新標題。所以我可以用這些變量運行一個正則表達式。

$url = 'http://website.com/link-is-looooooong.txt'; 
$new_title = 'hello'; 
$new_url = 'http://otherwebsite.com/'; 

它會返回相同的原始消息,但鏈接已更改。

<!-- m --><a class="postlink" href="http://otherwebsite.com/">hello</a><!-- m --> 

我試過把它調整到這樣的東西,但我不能把它弄清楚。我不知道如何建立匹配的結果,因此它在替換後具有相同的格式。

$message = preg_replace('#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+")?href="'.preg_quote($url).'" target\=\"_blank\">(.*?)</a><!\-\- \1 \-\->#', $replace, $message); 

回答

0

你需要捕捉成羣的其他部分,以及再在更換使用它們。嘗試如下:

$replace = '\1http://otherwebsite.com/\3hello\4'; 
$reg = '#(<!-- ([mw]) --><a (?:class="[\w-]+")?href=")'.preg_quote($url).'("(?: target="_blank")?>).*?(</a><!-- \2 -->)#'; 
$message = preg_replace($reg, $replace, $message); 

請參閱here

1

你會發現用正則表達式解析HTML會很痛苦,並且會變得非常複雜。最好的辦法是使用DOM解析器,like this one,並修改了鏈接,而不是。

+0

我所知道的與正則表達式和HTML的問題。但它來自phpbb數據庫,所以結構始終一致。 – Tike