2010-11-20 21 views
-1

Aşağıdaki çıktıları elde etmek için nasıl tek bir satır ile preg_replace() ? regex php: "kurtulun [link1] kurtulun [link2] ... kurtulun" - Sorun yok "yok" [Link]

$string1="get rid1 [link1] get rid2 [link2] ..."; // any number of links 
echo "[<a href=link1>link1</a>][<a href=link2>link2</a>]"; 
$string2="get rid any text any text get rid"; // = no links: is a possibility 
echo ""; 

Ben örnek $ dize1 için çalışır ancak yukarıda $ dize2 için hangi aşağıdaki çalıştı:

$regex="/". 
"[^\[\]]*". // the non-bracketed text before: -> eliminate 
"\[(.*?)\]". // the bracketed text: [.]: -> convert into links 
"[^\[\]]*"; // get rid of non-bracketed text after: -> eliminate 
"/"; 
echo preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1); 

Ben (?:...) işe yarayabilecek olmayan yakalama grupları düşünüyorum, ama onu anlamaya olamaz ...

+0

Bu "kurtulmak" ile kafam karışıyor. Her zaman "kurtulmak" mı? Ya da başka bir şey olabilir mi? Belirsiz. – BeemerGuy

+0

ve "[bağlantılar]" olmadığında başarısız olduğunu söylüyorsunuz, o zaman herhangi bir çıktı olmaz ... başarısızlık nedir? – BeemerGuy

+0

'kurtulmak' herhangi bir non-parantezli metin olabilir, "blah blah blah metin blah metni [link1] blah blah [linktextofanysort2] blah metin blah". Şimdi daha net olan var mı? - Asıl sorumu değiştirdim, yukarıya bakın: ... – ajo

cevap

0

Neden olmasın?

if ($output = preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1)) 
echo $output; 

Düzenleme: senin regex çizgisinde ... önce ve çok bağlantı argümanlar arkasına metin yapmak gerekir bu yüzden preg_replace eşleşti metnin TÜM yerini alacak, çalışmaz:

preg_replace("(text we dont want to replace)(text we do want to replace)(more junk text)",$1." altered $2 = ".$2." ".$3, $string1) 

.

$output = preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1); 
if ($output != $string1) 
echo $output; 
+0

Çalışıyor! "yükselen güneş (cf [幹]) + [乙] tek" düzgün bir şekilde bağlanır "[幹] [乙]" – ajo

+0

Evet, ancak yalnızca bağlantıyı değiştirmek istiyorsunuz, bu şekilde de istemediğiniz metni siler ... –

+0

? son yorumum olarak çıktı tam olarak nasıl istediğimi, ancak "[.]" yapıları yok ise boş çıktı ile mücadele ediyorum .... – ajo

İlgili konular