2012-01-11 2 views
10

Я пишу класс проверки формы и хочу включить регулярные выражения в проверку. Следовательно, регулярное выражение не гарантируется.Проверьте, является ли регулярное выражение допустимым в PHP

Как я могу (эффективно) проверить правильность регулярного выражения?

ответ

15

Используйте шаблон в своих звонках preg_*. Если функция возвращает false, вероятно, проблема с вашим шаблоном. Насколько я знаю, это самый простой способ проверить правильность шаблона регулярного выражения в PHP.


Вот пример задания правильного вида булевой проверки:

$invalidPattern = 'i am not valid regex'; 
$subject = 'This is some text I am searching in'; 
if (@preg_match($invalidPattern, $subject) === false) { 
    // the regex failed and is likely invalid 
} 
+2

Просто чтобы подчеркнуть, это строго ('===') Boolean 'false', а не значение фальши (' == '), такое как' 0'. – Wiseguy

+0

Это похоже работа. Я предположил, что preg_ * вернет false, если это не соответствует выражению, тем самым давая ложные срабатывания. – CrazeD

+2

@CrazeD В зависимости от вызываемой функции и передаваемой опции может быть множество значений. Для выше, если '$ subject' не соответствует' $ pattern', и был действителен, он вернет '0'. Однако 'preg_replace' вернет' NULL' при ошибке вместо false. Вам просто нужно взглянуть на документы для конкретной функции, которую вы используете. – cspray

-7

Это мое решение, используя предстоящее предупреждение, если что-то не так с выражением:

function isRegEx($test) 
{ 
    $notThisLine = error_get_last(); 
    $notThisLine = isset($notThisLine['line']) ? $notThisLine['line'] + 0 : 0; 
    while (($lines = rand(1, 100)) == $notThisLine); 
    eval(
     str_repeat("\n", $lines) . 
     '@preg_match(\'' . addslashes($test) . '\', \'\');' 
    ); 
    $check = error_get_last(); 
    $check = isset($check['line']) ? $check['line'] + 0 : 0; 
    return $check == $notThisLine; 
} 
+4

-1 для нечеткого кода, 'rand()', 'eval()' и '+ 0'. – Dan

+0

Серьезно, мне удалось найти свой путь назад, и я до сих пор не имею абсолютно никакого представления об этом фрагменте; что он делает? – Dan

+0

Это выборочная попытка try-catch. Очень ужасно читать, но это, вероятно, работает. Я бы просто использовал try-catch. – twicejr

1

Когда ты есть отчет об ошибках, вы не можете уйти просто с проверкой логического результата. Если сообщение не выдано, предупреждения выдаются (т. Е. «Предупреждение: без конечного разделителя xxx найдено».)

То, что я нахожу странным, заключается в том, что документация PHP ничего не сообщает об этих брошенных предупреждениях.

Ниже приведено мое решение этой проблемы, используя try, catch.

//Enable all errors to be reported. E_WARNING is what we must catch, but I like to have all errors reported, always. 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

//My error handler for handling exceptions. 
set_error_handler(function($severity, $message, $file, $line) 
{ 
    if(!(error_reporting() & $severity)) 
    { 
     return; 
    } 
    throw new ErrorException($message, $severity, $severity, $file, $line); 
}); 

//Very long function name for example purpose. 
function checkRegexOkWithoutNoticesOrExceptions($test) 
{ 
    try 
    { 
     preg_match($test, ''); 
     return true; 
    } 
    catch(Exception $e) 
    { 
     return false; 
    } 
} 
2

Вы не должны использовать @, чтобы заглушить все ошибки, так как он также заглушает фатальные ошибки.

function isRegularExpression($string) { 
    set_error_handler(function() {}, E_WARNING); 
    $isRegularExpression = preg_match($string, "") !== FALSE; 
    restore_error_handler(); 
    return isRegularExpression; 
} 

Это только отключает предупреждения для вызова preg_match.

Смежные вопросы