我想显示正则表达式代码中的卡片: 啊显示出来的心, 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'等。
有人可以给我一些帮助吗?
答案 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;
答案 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);