我有以下字符串......
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);
你可以使用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。此外,该模式仅关注没有空格的名称。
考虑一下这个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>