我有以下字符串......
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 :(得分: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。此外,该模式仅关注没有空格的名称。
答案 1 :(得分: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>