我从扑克软件中有这样的文字(我强调了我需要替换的零件)。

--- flop --- JH 9H啊
driverseati检查
达灵顿还剩15秒
达灵顿赌100
InvisibleNigma致电100
driverseati折叠
- - 转动 - - JH 9H AH] [3C
达灵顿赌注200
InvisibleNigma致电200
---河--- JH 9H AH 3C] [TD

jh =心灵的杰克
9H = 9的心
啊=心的王牌
3c = 3个俱乐部

我想用 图片.

因此,这条线:---转---- JH 9H AH] [3C
需要成为:--- turn ----------- jh.gif 9h.gif ah.gif 3c.gif

我无法弄清楚preg_replace :(我可以在括号内只有一张卡(例如[3C])来弄清楚它还有一些括号有2张或1张卡。

这就是我对一张卡的拥有的东西:

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

任何帮助,将不胜感激。

有帮助吗?

解决方案

如果您正在寻找方括号(当您发现)时,很难做到这一点。如果您不尝试匹配它们,而只是在任何出现的卡名称中寻找卡名称,那就是一个束缚:

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

\b 标记检查单词边界。他们确保卡名称必须是一个独特的词,所以 AhAhead 例如,不匹配。

处理方括号非常复杂。理想情况下,您可以使用 lookahead和look bebehind断言 要检查它们,但是不幸的是,对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 标志以使搜索不敏感。

其他提示

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);
$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} 在比赛中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top