preg_replace:如何获得被替换的内容

时间:2013-08-05 13:05:44

标签: php regex string replace

我想显示正则表达式代码中的卡片: 啊显示出来的心, kc显示俱乐部之王 ...

我使用preg_replace()以这种方式做到这一点:

$arr = array('ah', 'kh', 'qh', ..., '3c', '2c');
$regex = '';
foreach ($arr as $i => $card)
{
    $regex .= $card;
    if ($i < count($arr) - 1)
        $regex .= '|';
}

$message = preg_replace('#('.$regex.')#', '<img src="'.$dontknow.'.png" class="card" alt="" />', $message);

我不知道src属性中放了什么值,我想告诉preg_replace()“当你发现'啊'你放啊.png,如果它是kc然后$ dontknow =='kc'等。

有人可以给我一些帮助吗?

5 个答案:

答案 0 :(得分:1)

使用$ 1引用 - 它是指向PHP通过preg_replace

匹配的第一个组的链接

答案 1 :(得分:1)

你可以这样做:

$message = preg_replace('#('.$regex.')#', 
                          '<img src="$1.png" class="card" alt="" />', $message);

答案 2 :(得分:1)

您不需要for循环。这是一个稍微改进的版本,带有正确的正则表达式。

$arr = array('ah', 'kh', 'qh', ..., '3c', '2c');

$message = preg_replace('/('. implode('|'. $regex) .')/is', '<img src="$1.png" class="card" alt="" />', $message);

答案 3 :(得分:1)

您只需在替换中使用$n来引用某个匹配组(n是一个数字)。

因为我们拿出了大枪:

  • 让我们使用preg_quote()来逃避数组中的正则表达式保留字符

  • PHP有一套很好的功能来处理数组,让我们使用implode()而不是那个丑陋的循环

  • From the comments,我意识到您需要添加字词边界\b,以防止将yeah等错误匹配替换为ye<img...>。见demo

<强>代码:

$message = 'foo qh bar';
$arr = array('ah', 'kh', 'qh', '3c', '2c');

$escaped_arr = array_map(function($v){
    return preg_quote($v, '#');
}, $arr); // Anonymous function requires PHP 5.3+

$message = preg_replace('#\b('.implode('|', $escaped_arr).')\b#', '<img src="$1.png" class="card" alt="" />', $message);

echo $message;

Online demo

答案 4 :(得分:0)

你应该通过在他们身上添加一个特殊字符(如下例中的@)来改善指示扑克牌的'标记'。这将保护您免于无意中更改其他文本段落:

$arr = array('ah', 'kh', 'qh', 'ac', '3c', '2c');
$txt = 'This is a line with cards @ah and @qh but with a potential head-ache.'; 
$rx = '#@('.join('|',$arr).')#';
echo preg_replace($rx,"<img src=$1.jpg>",$txt);