1

我想显示正则表达式代码中的卡片:ah 显示 As of heart,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() “当你找到 'ah' 你放 ah.png,如果它是 kc 那么 $dontknow == 'kc' 等等。

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

4

5 回答 5

1

使用 $1 参考 - 它是 PHP 通过 preg_replace 匹配的第一组的链接

于 2013-08-05T13:07:57.423 回答
1

你可以这样做:

$message = preg_replace('#('.$regex.')#', 
                          '<img src="$1.png" class="card" alt="" />', $message);
于 2013-08-05T13:12:45.253 回答
1

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

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

$message = preg_replace('/('. implode('|'. $regex) .')/is', '<img src="$1.png" class="card" alt="" />', $message);
于 2013-08-05T13:14:18.757 回答
1

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

既然我们拿出了大枪:

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

  • PHP 有一组很棒的函数来处理数组,让我们用它implode()来代替那个丑陋的循环

  • 从评论中,我意识到您需要添加单词边界\b以防止错误匹配,例如yeah被替换为ye<img...>。看这个演示

代码:

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

在线演示

于 2013-08-05T13:19:19.803 回答
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);
于 2013-08-05T13:31:03.563 回答