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

时间:2014-02-09 14:51:22

标签: php regex

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

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);

2 个答案:

答案 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>