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
仍然存在。