2017-01-09 78 views
0
|affffc100|Hitem:bb:101:1:1:1:1:48:-30:47:18:5:2:6:6:0:0:0:0:0:0:0:0|h[Subject Name]|h|r 

我通常打印出變量是^PHP替換,並用正則表達式除去指定模式

|cffffc700|Hitem:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x|h[SUBJECT_NAME]|h|r 

我的圖案^

所有X可以是AZ,0-9

在一列中我有很多像這樣的變量(最多8個)。 和所有的變量都具有這樣的字符串混合

|affffc100|Hitem:bb:101:1:1:1:1:48:-30:47:18:5:2:6:6:0:0:0:0:0:0:0:0|h[Gold]|h|r NEW SOLD |affffc451|Hitem:bb:101:1:1:1:1:25:-33:12:42:5a:2f:6w:6:0:0:0:0f:0:0a:0b:0|h[Copper]|h|r maximum price 15k|affffx312|Hitem:bb:101:1:1:1:1:25:-33:12:42:5a:2f:6w:6:0:0:0:0f:0:0a:0b:0|h[Silver]|h|r 

在一個變量我要清理所有這些不必要的模式,並在括號中只留下主體名稱。 []

所以;

|cffffc700|Hitem:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x|h[SUBJECT NAME]|h|r 

需要僅在我的變量中保留SUBJECT_NAME。 只是爲了提醒,我總是從我的每個變量中的這些模式不止一個...(最多8個) 我到處搜索它,但找不到任何合理的答案或者不錯的模式。試圖自己做,但我想我需要採取所有這些模式,並使其陣列和清理它,只留下這些主題名稱,但我不知道如何做到這一點。

我怎麼將它轉換爲:

|affffc100|Hitem:bb:101:1:1:1:1:48:-30:47:18:5:2:6:6:0:0:0:0:0:0:0:0|h[Gold]|h|r NEW SOLD |affffc451|Hitem:bb:101:1:1:1:1:25:-33:12:42:5a:2f:6w:6:0:0:0:0f:0:0a:0b:0|h[Copper]|h|r maximum price 15k|affffx312|Hitem:bb:101:1:1:1:1:25:-33:12:42:5a:2f:6w:6:0:0:0:0f:0:0a:0b:0|h[Silver]|h|r 

這樣的:

Gold NEW SOLD Copper maxiumum price 15k Silver 

我應該用什麼符,preg_replace?


一件事離開,當我有沒有我的特殊模式的字符串,我得到空結果從功能如:

$str = "15KKK sold, 20KK updated"; 

預期的結果:

"15KKK sold, 20KK updated" // same without any pattern 

但^那一個返回EMPTY結果..

另一個字符串:

$str = "|affffc100|Hitem:bb:101:1:1:1:1:48:-30:47:18:5:2:6:6:0:0:0:0:0:0:0:0|h[Uranium]|h|r 155kk |affffc451|Hitem:bb:101:1:1:1:1:25:-33:12:42:5a:2f:6w:6:0:0:0:0f:0:0a:0b:0|h[Metal]|h|r is sold"; 

預期的結果:

"Uranium 155kk Metal is sold" 

,如果我用非模式字符串函數返回空的結果這是我的問題,現在

非常感謝你

+0

問題已更新 – Liveth

+0

問題再次更新+ – Liveth

+0

不要重複已經完成的答案。添加一些樣例和預期結果。你最後的字符串來自哪裏?這個結構與前一個沒有任何關係。你對這個字符串有什麼期望?有多少種不同的結構? – Toto

回答

0

我會怎麼做:

$str = '|affffc100|Hitem:bb:101:1:1:1:1:48:-30:47:18:5:2:6:6:0:0:0:0:0:0:0:0|h[Gold]|h|r NEW SOLD |affffc451|Hitem:bb:101:1:1:1:1:25:-33:12:42:5a:2f:6w:6:0:0:0:0f:0:0a:0b:0|h[Copper]|h|r maximum price 15k|affffx312|Hitem:bb:101:1:1:1:1:25:-33:12:42:5a:2f:6w:6:0:0:0:0f:0:0a:0b:0|h[Silver]|h|r'; 

preg_match_all('/h(\[.+?\])\|h\|r([^|]*)/', $str, $m); 
for($i=0; $i<count($m[0]); $i++) { 
    $res .= $m[1][$i] . ' ' . $m[2][$i] . ' '; 
} 
echo $res,"\n"; 

輸出:

[Gold] NEW SOLD [Copper] maximum price 15k [Silver] 

如果你想保持不匹配字符串,測試的preg_match的結果:

if (preg_match_all('/h(\[.+?\])\|h\|r([^|]*)/', $str, $m)) { 
    for($i=0; $i<count($m[0]); $i++) { 
     $res .= $m[1][$i] . ' ' . $m[2][$i] . ' '; 
    } 
} else { 
    $res = $str; 
} 
echo $res,"\n"; 
+0

我已更新問題 – Liveth

+0

hello,有時我有不包含這些模式的字符串,如果我使用那樣的字符串不包含模式不顯示,我該如何解決它 – Liveth

+0

@ noname005:請編輯您的問題,並添加一些樣例和預期的結果。 – Toto

0

試試這個正則表達式:

\|\w{9}\|Hitem(?::-?\w+)+\|h\[(?<SUBJECTNAME>\w+)\]\|h\|r 

它會捕獲每個變量序列以及指定組中的相關元素名稱。

see the demo here

+0

非常感謝你,我已更新問題 – Liveth