【问题标题】:Problem with two preg_match-functions one after another一个接一个地出现两个 preg_match 函数的问题
【发布时间】:2020-10-28 02:59:30
【问题描述】:

我有一个变量$cart_item,其中包含我想包含在我的页面上的模板代码。

由于这个模板有一些我不需要的信息,我使用函数preg_match 查找并使用str_replace$cart_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);
        }

直到第一个 if 子句结束,一切正常。但是在我调用下一个preg_matchvar_dump($matches) 之后,数组是空的。

现在的窍门:如果我省略了第一个 if 子句,那么在第一次执行 preg_match 之后数组就不是空的。

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

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

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

【问题讨论】:

  • 你怎么知道preg_match("/(&lt;if type&gt;)(.+?)(&lt;\/if&gt;)/s", $cart_item, $matches); 是否真的匹配了一些东西?此外,您正在删除第一个匹配项,因此在第二个 preg_match() 上可能没有任何匹配项。
  • 查看这个答案以获得更好的方法来处理这个stackoverflow.com/questions/26702506/…
  • @Maxt8r 我知道,因为 if 子句正在工作。在这种情况下,$item['type'] 是 "",因此执行 else 子句。对于您的第二个注意事项:我在这里看不到问题。第二个preg_match 使用了不同的模式,那么这有什么关系呢?
  • @Maxt8r 我看不到与链接解决方案的相似之处。我正在尝试一些不同的东西,因为我根据$item-array 中提供的一些进一步信息进行替换。所以对我来说问题仍然是,第一个 if 子句对第二个preg_matchfunction 有什么影响。如果没有第一个 if 子句,它就可以工作。
  • 但是为什么第二个preg_match 应该尝试匹配已删除的相同内容?模式不同 - 第一个 preg_match 尝试查找“”,第二个尝试查找 。由于第一个 if 子句正常工作,“”部分不会被删除,并且对于第二个preg_match 仍然存在。

标签: php regex preg-match str-replace


【解决方案1】:

并且由于第一个 if 子句正常工作,“”部分不会被删除,并且对于第二个preg_match 仍然存在。

您忽略了str_replace 替换了所有出现的搜索字符串,因此str_replace($matches[3], "", $cart_item) 其中$matches[3]"&lt;/if&gt;" 也删除了"-part 此后不匹配。

如何解决问题的建议?

您可以使用PREG_OFFSET_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]));
        }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多