我有这样的文字从扑克软件(我已经强调了我需要更换的部分)。
---扑通---[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
标志,使搜索不区分大小写。