3

我有来自扑克软件的这样的文字(我已经突出显示了我需要替换的部分)。

--- FLOP --- [Jh 9h Ah]
driversati 过
牌 darrington 还有 15 秒的时间采取行动
darrington 下注 100
InvisibleEnigma 跟注 100
driversati 弃牌
--- TURN --- [Jh 9h Ah] [3c]
darrington 下注 200
InvisibleEnigma 跟注 200
--- 河流 --- [Jh 9h Ah 3c] [Td]

Jh = 红桃
9h = 红桃 9
Ah = 红桃 A
3c = 梅花 3

我想用IMAGES替换方括号内的卡片。

所以这一行: --- TURN --- [Jh 9h Ah] [3c]
需要变成: --- TURN --- jh.gif 9h.gif ah.gif 3c.gif

我无法弄清楚 preg_replace :( 我可以找出括号内的一张卡(如 [3c]),但我坚持替换 1 行上的多个实例和一些有 3 张卡的括号和一些有 2 或 1 卡的括号。

这就是我的单卡:

\[([AKQJakqj1-9]0?[DHSCdhsc])\]

任何帮助,将不胜感激。

4

3 回答 3

1

如果您正在寻找方括号(正如您所发现的那样),这很难做到。如果您不尝试匹配它们而只是查找卡名,无论它们出现在哪里,那么这很容易:

\b([AKQJakqj1-9]0?[DHSCdhsc])\b

\b标记检查单词边界。他们确保卡名必须是一个不同的单词,例如AhinAhead不会匹配。

处理方括号相当复杂。理想情况下,您可以使用lookahead 和lookbehind 断言来检查它们,但是对lookbehind 断言有一个不幸的限制,这使得它们不适合这项工作:

回溯断言的内容受到限制,因此它匹配的所有字符串都必须具有固定长度。

因此,我想出了一个双重替换解决方案,使用/e标志将一个preg_replace调用嵌套在另一个调用中。

preg_replace(
    '/\[(.*?)]/e',
    "preg_replace('/(\b[AKQJT1-9]0?[DHSC]\b)/i', '\\\$1.jpg', '$1')",
    $hh
);

外部正则表达式查找方括号并捕获内部。内部正则表达式在其中查找卡片名称$1并将它们转换为图像。

顺便说一句,我添加T到您的模式中,因为 10♦ 通常写成Td手牌历史,并且我添加了i标志以使搜索不区分大小写。

于 2010-08-27T21:53:58.793 回答
0
$string = "--- RIVER --- [Jh 9h Ah 3c] [Td]";

$CARD = "[akqjt1-9][dhsc]";
echo preg_replace(
  "/\[($CARD(?:\s+$CARD){0,4})\]/ie",
  "preg_replace('/\b$CARD\b/i', '\\\$0.gif', '\$1')",
  $string);

此代码输出:

--- RIVER --- Jh.gif 9h.gif Ah.gif 3c.gif Td.gif


看起来约翰(勉强!)在我破解时击败了我,虽然我的代码更具体一些 - 它不会在括号内的任何字符串上运行替换,例如[as the world turns],它必须是一组卡片。我还将它限制为括号中的 5 张卡片,尽管您可以通过简单地{0,4}在比赛中调整来改变这一点。

于 2010-08-27T22:45:29.480 回答
0
function imageize($matches)
{
    $from = array('s','c','d','h','[',']');
    $to = array('s.gif','c.gif','d.gif','h.gif','','');
    return $matches[1] . str_replace($from, $to, strtolower($matches[2])) . $matches[3];
}

$str = preg_replace_callback('#([^\[\]]*?)((?: *\[[akqjtcsdh\d ]+\])+)([^\[\]]*?)#i', 'imageize', $str);
于 2010-08-27T23:11:28.377 回答