1

正規表現コードからカードを表示したい: ah はハートのように、kc は King of clubs を表示します ...

私は 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

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

$1 参照を使用 - これは、PHP が preg_replace によって一致した最初のグループへのリンクです

于 2013-08-05T13:07:57.423 に答える
1

$n特定の一致するグループ (nは数字)を参照するために、置換で使用する必要があるだけです。

大きな銃を引き抜いたので:

  • preg_quote()配列内の正規表現予約文字をエスケープするために使用しましょう

  • PHP には、配列を操作するための優れた関数セットがあります。implode()その醜いループの代わりに使用しましょう

  • コメントから、に置き換えられる\bなどの誤った一致を防ぐために、単語の境界を追加する必要があることに気付きました。このデモを見るyeahye<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 に答える
1

あなたはこれを行うことができます:

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