2014-02-09 97 views
0

我有以下字符串...正則表達式複式元素一個字符串

Out with the <_link>user://1|Team GB for 
<_link>tag://FridayBeers|#FridayBeers 

我寫了下面的正則表達式剝離了標籤和字符。

~<(/){0,1}.*?(/){0,1}>|(tag://\w*\||user://[0-9]*\|)~ 

但是我現在需要實現如下

<_link>user://1|Team GB被轉換爲<a href="user/1">Team GB</a><_link>tag://FridayBeers|#FridayBeers<a href="tags/FridayBeers">#FridayBeers</a>

可以將某些職位,改變了我的正則表達式允許這個我一個答案使用PHP;

$post_text = "Out with the <_link>user://1|Team GB for <_link>tag://FridayBeers|#FridayBeers"; 
$pattern = "~<(/){0,1}.*?(/){0,1}>|(tag://\w*\||user://[0-9]*\|)~"; //"~<(/){0,1}.*?(/){0,1}>|(tag://\w*\||user://[0-9]\|)~"; 
$replacement = " "; 
$regexd = preg_replace($pattern, $replacement, $post_text); 
+0

你或許應該看看[preg_replace_callback(http://www.php.net/manual/de/function.preg-replace-callback.php) – kelunik

+0

@kelunik感謝您的提示,你可以發佈一個代碼示例顯示你將如何做到這一點的答案,我感謝它 –

回答

1

您可以使用preg_replace_callback來實現此目的。以下代碼示例只是一個最小示例(請參閱下面的通知)。

<?php 

$pattern = "~\<_link\>((?<typeUser>user)\://(?<userId>\d+)\|(?<userName>[a-zA-Z]+)|(?<typeTag>tag)\://(?<tagLink>[a-zA-Z]+)\|#(?<tagTitle>[a-zA-Z]+))~"; 
$string = "<_link>user://1|Team GB and <_link>tag://FridayBeers|#FridayBeers"; 

echo preg_replace_callback($pattern, function($match) { 
    if(!empty($match['typeUser'])) { 
     return '<a href="user/'.$match['userId'].'">'.$match['userName'].'</a>'; 
    } else { 
     return '<a href="tags/'.$match['tagLink'].'">'.$match['tagTitle'].'</a>'; 
    } 
}, $string); 

此代碼不關心轉義HTML。此外,該模式只關心沒有空格的名稱。

+0

這似乎很好地工作,並感謝你,但根據示例中的一些名稱中有空格舉例來說,我的名字是'Justin Erswell',無論如何處理? –

+0

你需要清楚的是名稱的結尾。想象下面的輸入:'<_link>用戶:// 1 |團隊GB是...團隊.'應該'是'是否堅持名稱?你的腳本應該如何知道? – kelunik

+0

你說得對,當然這有點棘手,不幸的是我被數據卡住了。謝謝你的幫助! –

1

考慮這個preg_replace代碼:

$s = '<_link>tag://FridayBeers|#FridayBeers'; 
$r = preg_replace('~<_link>([^:]+)://([^|]+)\|([\w -]+)~', '<a href="$1/$2">$3</a>', $s); 
//=> <a href="tag/FridayBeers">#FridayBeers</a> 
相關問題