2013-03-26 2 views
1

Есть ли способ сделать это, не используя оператор управления ошибкой на @preg_match? :)Как узнать, является ли строка регулярным выражением PHP?

Поскольку PHP требует, чтобы образцы завернуты между характером, я думал сделать это следующим образом:

  1. Получить первый символ.
  2. Найти последнее вхождение этого символа в строке с:

    $rpos = strrpos($string, $string[0]); 
    
  3. Получить список модификаторов:

    $mods = substr($rpos, strlen($string)); 
    
  4. Find out if there are any invalid modifiers in this list. Если есть return false, в противном случае regex окажется действительным.

Насколько надежным является решение? Есть ли лучшие?

+0

Не надежный на всех – zerkms

+0

Можете ли вы привести пример строки, где он потерпит неудачу? –

+1

Вы можете использовать filter_var() с опцией FILTER_VALIDATE_REGEXP – aurbano

ответ

2

Я всегда использовать this function в компоненте Symfony2 Finder:

if (preg_match('/^(.{3,}?)([imsxuADU]*)$/', $expr, $m)) { 
    $start = substr($m[1], 0, 1); 
    $end = substr($m[1], -1); 

    if (($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start)) || ($start === '{' && $end === '}')) { 
     // It's a regex! 
    } 
} 
+0

nice: DI думаю, что это делает то же, что я и предложил, но также проверяет минимальные символы –

1

В разделе commets он уже описанная в коротком пути. Но вы можете проверить, если регулярное выражение в порядке, используя метод filter_var

$string = "String to match"; 

if (filter_var($string, FILTER_VALIDATE_REGEXP, array("options" => array("regexp" => "/abc/")))) { 
    echo "Regex is OK"; 
} else { 
    echo "Regex not okay"; 
} 
+0

' Warning: filter_var() [function.filter-var]: опция 'regexp' отсутствует в .. . –

+0

Вторая часть PHP - это код, который нужно использовать. Установки filter_var, которые я впервые использовал, доступны только в w с другими фильтрами (например, FILTER_VALIDATE_INT). – Benz

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