preg_replace在1行上多个实例?
-
01-10-2019 - |
题
我从扑克软件中有这样的文字(我强调了我需要替换的零件)。
--- flop --- JH 9H啊
driverseati检查
达灵顿还剩15秒
达灵顿赌100
InvisibleNigma致电100
driverseati折叠
- - 转动 - - JH 9H AH] [3C
达灵顿赌注200
InvisibleNigma致电200
---河--- JH 9H AH 3C] [TDjh =心灵的杰克
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
标记检查单词边界。他们确保卡名称必须是一个独特的词,所以 Ah
在 Ahead
例如,不匹配。
处理方括号非常复杂。理想情况下,您可以使用 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}
在比赛中。