2016-04-06 3 views
0

Ich habe mit einem Plugin gearbeitet und dieses Plugin hat eine benutzerdefinierte Feldprüfung, die nicht zu funktionieren scheint. Unter dem Code des Plugins wird ein benutzerdefiniertes Feld mit einer bestimmten Bedingung überprüft.preg_match(): Trennzeichen darf nicht alphanumerisch oder Backslash mit benutzerdefinierter Feldüberprüfung sein

<?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; 
    } 
}?> 

Das Problem liegt in der 'enthält' Zeile und geben den folgenden Fehler in meinem debug.log:

PHP Warning: preg_match(): Delimiter darf nicht alphanumerische oder Backslash

Die Prüfung wird verwendet, um zu prüfen, ob ein benutzerdefiniertes Feld entweder '30', 'text1' oder 'text2' enthält.

Jetzt könnte ich hier falsch liegen, aber ich glaube, ich verwende hier kein Trennzeichen. Was könnte hier schief gehen?

Antwort

0

preg_match erwartet die Parameter in dieser Reihenfolge: preg_match($pattern, $string). Auch das Muster benötigt z.B. Schrägstriche als Trennzeichen vorwärts. So eine mögliche Lösung wäre:

... 
|| ($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'])) 
... 

Wenn Sie eine einfache Prüfung tun wollen, wenn eine Zeichenfolge innerhalb des benutzerdefinierten Feldes ist, würde ich mit strpos aus Performance-Gründen empfiehlt:

... 
|| ($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) 
... 
+0

Als ich das gelesen Ich dachte, es würde funktionieren, leider nicht. Ich glaube, manchmal gibt ein benutzerdefiniertes Feld in WordPress "Array" zurück. könnte es sein, dass preg_match() nicht auf arrays funktioniert? –

+0

Das Handbuch behauptet, es gibt nur 1 zurück (für gefunden), 0 (für nicht gefunden) und FALSE (wenn ein Fehler aufgetreten ist) – noreabu

+0

Für mich tritt ein Fehler aber unbekannt warum. Ich denke, weil es ein Array ist, aber ich könnte falsch liegen. Ich habe den Entwickler kontaktiert und werde aktualisieren, wenn eine Antwort eingegangen ist. –

Verwandte Themen