Php 两个preg_match函数相继出现的问题

Php 两个preg_match函数相继出现的问题,php,regex,preg-match,str-replace,Php,Regex,Preg Match,Str Replace,我有一个变量$cart\u item,其中包含我想在页面上包含的模板的代码 由于此模板包含一些我不需要的信息,我使用函数preg\u match查找并str\u replace从$cart\u item中删除这些信息。 我第一次使用preg_match时,效果很好。但是第二次我想用它时,它找不到任何匹配项 守则: preg_match("/(<if type>)(.+?)(<\/if>)/s", $cart_item, $matches

我有一个变量
$cart\u item
,其中包含我想在页面上包含的模板的代码

由于此模板包含一些我不需要的信息,我使用函数
preg\u match
查找并
str\u replace
$cart\u item
中删除这些信息。 我第一次使用
preg_match
时,效果很好。但是第二次我想用它时,它找不到任何匹配项

守则:

        preg_match("/(<if type>)(.+?)(<\/if>)/s", $cart_item, $matches);
        if($item['type'] != "") {
            $cart_item = str_replace($matches[1], "", $cart_item);
            $cart_item = str_replace($matches[3], "", $cart_item);
            $cart_item = str_replace("{{item_type}}", $item['type'], $cart_item);
        } else {
            $cart_item = str_replace($matches[0], "", $cart_item);
        }

        preg_match("/(<if campaign_codes>)(.+?)(<\/if>)/s", $cart_item, $matches);

        var_dump($matches);

        if($item['campaign_codes'] != "") {
        } else {
            echo "Keine Kampagnen vorhanden";
            $cart_item = str_replace($matches[0], "", $cart_item);
        }
preg_match(“/()(.+?)()/s”,$cart_item,$matches);
如果($item['type']!=“”){
$cart\u item=str\u replace($matches[1],“”,$cart\u item);
$cart\u item=str\u replace($matches[3],“”,$cart\u item);
$cart_item=str_replace(“{{item_type}},$item['type'],$cart_item”);
}否则{
$cart\u item=str\u replace($matches[0],“”,$cart\u item);
}
preg_match(“/()(.+?)()/s”,$cart_item,$matches);
var_dump($matches);
如果($item['campaign_code']!=“”){
}否则{
回音“Keine Kampagnen vorhanden”;
$cart\u item=str\u replace($matches[0],“”,$cart\u item);
}
在第一个if子句结束之前,一切正常。但是在我调用下一个
preg\u match
var\u dump($matches)
之后,数组是空的

现在的诀窍是:如果省略第一个if子句,那么在第一次执行
preg\u match
之后,数组就不是空的

我已经尝试过重命名第二个
preg_match
的数组,但是没有帮助

我不知道怎么做,但是第一个if子句似乎做了它不应该做的事情

谁能给我解释一下,给我一个解决问题的建议

由于第一个if子句工作正常,因此未删除“”-部分,并且第二个
preg\u match
仍然存在

您忽略了替换搜索字符串的所有匹配项,因此
str\u replace($matches[3],“”,$cart\u item)
其中
$matches[3]
还删除了随后不匹配的“--部分的结束标记

如何解决这个问题的建议

您可以使用
PREG\u OFFSET\u CAPTURE
删除找到的匹配项,而不删除其他内容:

        preg_match("/(<if type>)(.+?)(<\/if>)/s", $cart_item, $matches, PREG_OFFSET_CAPTURE);
        if ($item['type'] != "") {
            $cart_item = substr_replace($cart_item, "", $matches[3][1], strlen($matches[3][0]));
            $cart_item = str_replace("{{item_type}}", $item['type'], $cart_item);
            $cart_item = substr_replace($cart_item, "", $matches[1][1], strlen($matches[1][0]));
        } else {
            $cart_item = substr_replace($cart_item, "", $matches[0][1], strlen($matches[0][0]));
        }
preg_匹配(“/()(.+?)()/s”,$cart_item,$matches,preg_OFFSET_CAPTURE);
如果($item['type']!=“”){
$cart_item=substr_replace($cart_item,“,$matches[3][1],strlen($matches[3][0]);
$cart_item=str_replace(“{{item_type}},$item['type'],$cart_item”);
$cart_item=substr_replace($cart_item,“,$matches[1][1],strlen($matches[1][0]);
}否则{
$cart\u item=substr\u replace($cart\u item,“,$matches[0][1],strlen($matches[0][0]);
}

请注意,删除操作必须按从后到前的顺序进行,因为它们会更改以下字符串部分的位置。

如何知道
preg_匹配(“/()(.+?)()/s”,$cart_item,$matches)实际匹配了什么?此外,您正在删除第一个匹配项,因此第二个preg_match()上可能没有可匹配的项。请参阅此答案,以获得更好的方法来处理@Maxt8r,我知道,因为if子句正在工作。在这种情况下,
$item['type']
是“”,因此执行else子句。还有你的第二个注意事项:我看不出这里有什么问题。第二个
preg_match
使用了不同的模式,那么这有什么关系呢?@Maxt8r我看不出与链接解决方案有什么相似之处。我正在尝试一些不同的东西,因为我根据
$item
-数组中给出的一些进一步信息进行替换。所以我的问题仍然是,第一个if子句对第二个
preg\u match
函数有什么影响。如果没有第一个if子句,它可以工作。但是为什么第二个
preg\u match
要尝试匹配已删除的相同内容呢?模式不同-第一个
preg_match
尝试查找“”,第二个尝试查找“”。由于第一个if子句工作正常,因此未删除“”-部分,并且第二个
preg\u match
仍然存在。