Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php替换为正则表达式,并用正则表达式删除指定的模式_Php_Regex_Preg Replace - Fatal编程技术网

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

php替换为正则表达式,并用正则表达式删除指定的模式,php,regex,preg-replace,Php,Regex,Preg Replace,我通常打印出来的变量是^ |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 我的模式是^ 所有X都可以是a-Z,0-9 在一列中,我有许多这样的变量(最多8个)。 所有变量都混合了如下字符串: |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 在一个变量中

我通常打印出来的变量是^

|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
我的模式是^

所有X都可以是a-Z,0-9

在一列中,我有许多这样的变量(最多8个)。 所有变量都混合了如下字符串:

|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_名称。 只是提醒一下,我的每个变量中都有不止一个来自这些模式的变量。。。(最多8个) 我到处找,但找不到任何合理的答案,也找不到好的模式。我试着自己做,但我想我需要把所有这些模式,使其数组,并清理它,只留下这些主题名称,但我不知道确切地怎么做

如何将其转换为:

|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
这:

我应该使用什么,preg_替换


还有一件事,当我有一个没有特殊模式的字符串时,我从函数中得到空结果,例如:

Gold NEW SOLD Copper maxiumum price 15k Silver
预期结果:

$str = "15KKK sold, 20KK updated";
$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";
但是^1返回空结果

另一个字符串:

"15KKK sold, 20KK updated" // same without any pattern
预期结果:

$str = "15KKK sold, 20KK updated";
$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"
\\\\w{9}\\\Hitem(?:-?\w+++)\\\h\[(?\w+)\]h\\r
它将捕获每个变量序列,以及命名组中的相关元素名称

我会:

\|\w{9}\|Hitem(?::-?\w+)+\|h\[(?<SUBJECTNAME>\w+)\]\|h\|r
如果要保留不匹配的字符串,请测试preg_match的结果:

[Gold]  NEW SOLD  [Copper]  maximum price 15k [Silver]  
if(preg\u match\u all('/h(\[.+?\])\\\\h\\r([^.]*])/',$str,$m)){

对于($i=0;$ihello,有时我有不包含这些模式的字符串,如果我这样使用,不包含模式的字符串不会出现,我如何解决it@noname005:请编辑您的问题,并为所有问题添加一些示例案例和预期结果。@noname005:请参阅我的编辑,这是您要找的吗?问题再次更新+不要重复已经完成的答案。添加一些示例案例和预期结果。您的最后一个字符串来自何处?该结构与前一个字符串无关。您希望从该字符串中得到什么?存在多少不同的结构?问题已更新..添加了其他预期
[Gold]  NEW SOLD  [Copper]  maximum price 15k [Silver]  
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";