【问题标题】:preg_match(): Delimiter must not be alphanumeric or backslash with custom field checkpreg_match():定界符不能是字母数字或反斜杠,带有自定义字段检查
【发布时间】:2016-07-26 20:43:03
【问题描述】:

我一直在使用一个插件,这个插件有一个自定义字段检查,它似乎不起作用。下面是用于检查具有特定条件的自定义字段的插件代码。

<?php if ($custom_field_value != null) {
    if (($set['condition']['value']['operator'] == 'is' && $set['condition']['value']['value'] == $custom_field_value)
    || ($set['condition']['value']['operator'] == 'is_not' && $set['condition']['value']['value'] != $custom_field_value)
    || ($set['condition']['value']['operator'] == 'contains' && preg_match($set['condition']['value']['value'], $custom_field_value)) //The problematic line.
    || ($set['condition']['value']['operator'] == 'does_not_contain' && !preg_match($set['condition']['value']['value'], $custom_field_value))
    || ($set['condition']['value']['operator'] == 'lt' && $set['condition']['value']['value'] < $custom_field_value)
    || ($set['condition']['value']['operator'] == 'le' && $set['condition']['value']['value'] <= $custom_field_value)
    || ($set['condition']['value']['operator'] == 'eq' && $set['condition']['value']['value'] == $custom_field_value)
    || ($set['condition']['value']['operator'] == 'ge' && $set['condition']['value']['value'] >= $custom_field_value)
    || ($set['condition']['value']['operator'] == 'gt' && $set['condition']['value']['value'] > $custom_field_value)) {
        $proceed = true;
    }
}?>

问题在于“包含”行,并在我的 debug.log 中给出以下错误:

PHP 警告:preg_match():分隔符不能是字母数字或反斜杠

检查用于检查自定义字段是否包含“30”、“text1”或“text2”。

现在我在这里可能是错的,但我相信我在这里没有使用任何分隔符。这里可能出了什么问题?

【问题讨论】:

    标签: php wordpress plugins preg-match contains


    【解决方案1】:

    preg_match 期望参数按以下顺序:preg_match( $pattern, $string)。模式也需要例如正斜杠作为所述分隔符。所以一个可能的解决方案是:

    ...
    || ($set['condition']['value']['operator'] == 'contains'
        &&  preg_match('/' . $custom_field_value . '/', $set['condition']['value']['value'] ))
    || ($set['condition']['value']['operator'] == 'does_not_contain'
        && !preg_match('/' . $custom_field_value . '/', $set['condition']['value']['value'] ))
    ...
    

    如果您想做一个简单的检查,如果字符串在自定义字段中,出于性能原因,我建议使用strpos

    ...
    || ($set['condition']['value']['operator'] == 'contains'
        &&  strpos($set['condition']['value']['value'],$custom_field_value) > 0)
    || ($set['condition']['value']['operator'] == 'does_not_contain'
        &&  strpos($set['condition']['value']['value'],$custom_field_value) == FALSE)
    ...
    

    【讨论】:

    • 当我读到这篇文章时,我认为它会起作用,但遗憾的是它不起作用。我相信有时 wordpress 中的自定义字段会返回 Array。会不会是 preg_match() 不适用于数组?
    • 手册声称,它只返回1(找到)、0(未找到)和FALSE(如果发生错误)
    • 对我来说发生了错误,但不知道为什么。我认为因为它是一个数组,但我可能是错的。我已经联系了开发人员,并会在收到答复后进行更新。
    • 啊,对不起,我误读了评论...如果您愿意,您能否提供有关 $custom_field_value 变量分配的更多信息?一个“丑陋”的解决方法也可能是(is_array($custom_field_value)) ? implode($custom_field_value) : $custom_field_value;,但最好检查 $custom_field_value 的内容,例如var_dump() 优先
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多