2014-02-09 51 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> 
相关问题