2016-07-27 32 views
1

替換詞我有這樣正則表達式的幫助與超級鏈接

"this TEST-001 is test TEST-001string TEST-001" 

字符串所以我需要讓所有的TEST-001超級鏈接包裹像

我都試過,但其應用的超鏈接到所有匹配的角色。

$re1='(TEST)'; # Word 1 
$re2='(-)'; # Any Single Character 1 
$re3='(\d+)'; # Integer Number 1 

echo preg_replace("/([".$re1.$re2.$re3."])/", "<a href=/$1>$1</a>", $txt); 
+0

刪除'['和']'並使用'$ 0'而不是'$ 1'。 –

+0

解決了謝謝.. – Lasith

回答

0

您創建了一個字符類[],這些應該被刪除。實際上,你正在創建太多的捕獲組,它們都是多餘的。

你可以使用這個簡化代碼:

$txt = "this TEST-001 is test TEST-001string TEST-001"; 
$re1='TEST'; # Word 1 
$re2='-'; # Any Single Character 1 
$re3='\d+'; # Integer Number 1 
echo preg_replace("/$re1$re2$re3/", "<a href=/$0>$0</a>", $txt); 

IDEONE demo

注意的是,整場比賽可以使用替換字符串內$0反向引用來反向引用,因此,沒有必要包裹整個模式與一個額外的捕獲組(與Perl舊版本不同,其中$&相同的反向引用導致性能問題)。

+0

很高興爲你工作。如果我的回答對你有幫助,請考慮upvoting(參見[如何在堆棧溢出?](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)) 。 –

0

問題是[。刪除他們我現有的代碼似乎像一個魅力工作

$re1='(TEST)'; # Word 1 
$re2='(-)'; # Any Single Character 1 
$re3='(\d+)'; # Integer Number 1 

echo preg_replace("/(".$re1.$re2.$re3.")/", "<a href=/$1>$1</a>", $txt); 
+0

您將模式與您不使用的捕獲組重載。請看我的答案。另外,你可以在雙引號字符串裏面使用字符串插值,這樣可以縮短代碼的長度。此外,不需要在整個模式和'$ 1'周圍使用捕獲組,您可以使用'$ 0'反向引用。 –