preg_match():分隔符不能是字母数字或带有自定义字段检查的反斜杠


preg_match(): Delimiter must not be alphanumeric or backslash with custom field check

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

<?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"。

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

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)
...