Я работал с плагином, и у этого плагина есть проверка пользовательского поля, которая, кажется, не работает. Ниже приведен код плагина, используемый для проверки настраиваемого поля с определенным условием.
<?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)
...
Других решений пока нет …