我有这样的文字从扑克软件(我已经强调了我需要更换的部分)。
---扑通---[JH 9H AH]
DriverSati检查
达林顿还有15秒可以上场
达林顿赌100
Invisibleenigma呼叫100
driversati折叠
---转弯---[JH 9H AH][3C]
达林顿赌200
隐形伊格玛呼叫200
---河流---[JH 9H AH 3C][TD]
JH=心脏杰克
9H=9颗心
AH=红心王牌
3c=3个俱乐部
我想把方括号里的卡片换成图片。
所以这条线:---转---[JH 9H AH][3C]
需要变成:----转---jh.gif 9h.gif ah.gif 3c.gif
我不知道preg_replace是什么:(我可以在括号内找到一张卡片(比如[3c]),但我坚持在一行中替换多个实例,有些括号有3张卡片,有些括号有2张或1张卡片。
这就是我的一张卡:

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

任何帮助都将不胜感激。

最佳答案

如果你在寻找方括号(正如你发现的那样),这是很难做到的。如果你不试着匹配它们,只是简单地查找卡片名称,不管它们出现在哪里,那就很容易了:

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

\b标记检查单词边界。它们确保卡名必须是一个不同的单词,例如,Ah中的Ahead将不匹配。
处理方括号相当复杂。理想情况下,您可以使用lookahead and lookbehind assertions来检查它们,但是对于lookbehind断言有一个不幸的限制,这使得它们不适合该工作:
lookbehind断言的内容受到限制,因此它匹配的所有字符串必须具有固定长度。
因此,我提出了一个双替换解决方案,使用/e标志将一个preg_replace调用嵌套到另一个调用中。
preg_replace(
    '/\[(.*?)]/e',
    "preg_replace('/(\b[AKQJT1-9]0?[DHSC]\b)/i', '\\\$1.jpg', '$1')",
    $hh
);

外部regex查找方括号并捕获内部。内部regex在$1中查找卡名并将其转换为图像。
顺便说一句,我在你的模式中添加了T,因为10*在手写历史中通常写为Td,我添加了i标志,使搜索不区分大小写。

09-08 07:36