正则表达式多个元素一个字符串

问题描述 投票:1回答:2

我有以下字符串......

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);
php regex
2个回答
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
投票

考虑一下这个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>
© www.soinside.com 2019 - 2024. All rights reserved.