php 用正则表达式替换并用正则表达式删除指定的模式

php replace with regex and remove specified pattern with regex

|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

我通常打印出的变量是 ^

|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 可以是 a-Z、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

但是 ^ 那一个 returns 空结果..

另一个字符串:

$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"

如果我将该函数与非模式字符串一起使用,它 returns 结果为空,这就是我现在的问题

非常感谢

试试这个正则表达式:

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

它将捕获每个变量序列,以及命名组中的相关元素名称。

see the demo here

我愿意:

$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";