preg_replace 1行の複数のインスタンス?
-
01-10-2019 - |
質問
ポーカーソフトウェアからこのようなテキストがあります(交換する必要がある部品を強調しました)。
---フロップ--- JH 9H AH
Driverseatiチェック
Darringtonの行動は15秒です
ダリントンベット100
InvisibleEnigmaは100を呼び出します
Driverseati Folds
- - 振り向く - - JH 9H AH] [3c
Darringtonは200を賭けます
InvisibleEnigmaが200を呼び出します
- - 川 - - JH 9H AH 3C] [TDJH =ハートのジャック
9h = 9心臓の9
AH =ハートのエース
クラブの3c = 3
正方形の括弧内のカードをに交換したい 画像.
だからこの行:---ターン--- JH 9H AH] [3c
:---ターン--- jh.gif 9h.gif ah.gif 3c.gif
preg_replaceを把握できません:(ブラケット内の1枚のカード([3c]のように)の1枚のカードだけで把握できますが、1行の複数のインスタンスを交換し、3枚のカードを持っているブラケットをいくつか置き換えることに固執しています。 2枚または1枚のカードを持ついくつかのブラケット。
これは私が1枚のカードに持っているものです:
\[([AKQJakqj1-9]0?[DHSCdhsc])\]
どんな助けも感謝します。
解決
正方形の括弧を探している場合は、実行するのは困難です(発見したように)。それらを一致させようとして、単にカード名を探すことができない場合、どこで発生しても、それはシンチです。
\b([AKQJakqj1-9]0?[DHSCdhsc])\b
\b
マーカーは単語の境界をチェックします。彼らは、カード名が明確な言葉でなければならないことを保証するので、 Ah
の Ahead
たとえば、一致しません。
正方形の括弧を非常に複雑に処理します。理想的には使用できます lookaheadとlookbehindの主張 彼らをチェックするには、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
検索をケース非感受性にするためのフラグ。
他のヒント
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}
試合で。