2010-08-27 57 views
3

我有撲克軟件這樣的文字(我突出了我需要替換的部分)。preg_replace在1行上的多個實例?

--- --- FLOP [是Jh 9H阿]
driverseati檢查
達靈頓擁有15秒時起作用
達靈頓投注100
InvisibleEnigma調用100
driverseati褶皺
- - TURN --- [Jh 9h Ah] [3c]
darrington投注200
InvisibleEnigma cal LS 200
--- --- RIVER [是Jh 9H 3C阿] [TD]

是Jh =心中的傑克
9H心= 9
阿心=王牌
3C = 3的球杆

我想用方括號內的牌替換圖片

所以這行:--- TURN --- [是Jh 9h的啊] [3C]
需求,成爲:--- TURN --- jh.gif 9h.gif ah.gif 3c.gif

我無法弄清楚preg_replace :(我可以找出括號內的單個卡片(比如[3c]),但我堅持要在1行上替換多個實例,有3張卡,並具有2一些支架,或1卡支架

這是我有一個單卡:

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

任何幫助,將不勝感激。

+0

我很好奇,爲什麼你的模式中的'0'? – wuputah 2010-08-27 22:27:38

回答

1

如果你正在尋找方括號(如你所發現的),這很難做到。如果你不嘗試,以配合他們,只要看看該卡的名稱,任何地方發生,那麼它是不在話下:

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

\b標誌物檢查單詞邊界。他們確保卡名稱必須是不同的單詞,例如中的Ah將不匹配。

處理方括號相當複雜。理想情況下,你可以使用lookahead and lookbehind assertions即可查詢到,但有上向後斷言一個不幸的限制,使得它們不適合這份工作:

一個向後斷言的內容受到限制,使得所有它匹配的字符串必須有固定長度。

所以不是我想出了使用/e標誌巢另一個裏面一個preg_replace通話雙替代解決方案。

preg_replace(
    '/\[(.*?)]/e', 
    "preg_replace('/(\b[AKQJT1-9]0?[DHSC]\b)/i', '\\\$1.jpg', '$1')", 
    $hh 
); 

外部正則表達式尋找方括號並捕獲內部。內部正則表達式在那個$1裏尋找卡片名字並將它們變成圖像。

順便說一句,我說T到您的模式自10 ♦通常寫在手的歷史Td,我添加了i標誌,使搜索不區分大小寫。

+0

這確實有效,但像「as」這樣的常用詞也會被替換。所以我需要告訴正則表達式只是在括號內查找。 – 2010-08-27 21:58:50

+0

你必須匹配小寫版本嗎?那些會出現在自動化的手歷史中嗎? – 2010-08-27 22:01:25

+0

我也想用普通文本替換它(比如博客帖子,當用戶說 - 我是玩[ac] [Kd]並且輸了 - 意思是打Ace俱樂部的Ace和Diamond的國王)。所以我想替換粘貼的手歷史日誌,如原始帖子和用戶發佈的信息所示。 – 2010-08-27 22:11:05

0
$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}來改變它。

0
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);