2016-05-02 1 views
1

Ну, я застрял, я не могу найти правильную форму для RegEx для предоставления PHP preg_match.Поиск наличия символов или строк из разрешенных

У меня есть две строки. Скажите "mdo" и "o", но они могут быть действительно случайными.

У меня есть словарь разрешенных символов и строк.

Для примера допустимыми символами являются "a-gm0-9", а допустимые строки: "do" и "si".

ЦЕЛЬ

Я пытаюсь проверить, что строка ввода не содержит какой-либо символ или строку, но те, в словаре, без учета регистра.

Так что случай "mdo" не соответствует, потому что m разрешен так же, как строка do. Не то же самое для o, который имеет o, который не является разрешенным символом и который не содержит всю допустимую строку do.

Моя борющийся причина

Это нормально отрицать [^a-gm0-9] и (?!do|si), но то, что я не могу добиться того, чтобы поместить их в один регулярное выражение, чтобы применить следующий PHP код:

<?php 
    $inputStr = 'mdo'; 
    $rex = '/?????/i';  // the question subject 
    // if disallowed chars/strings are found... 
    if(preg_match($regex, $inputStr) == 1) 
    return false;  // the $inputStr is not valid 
    return true; 
?> 

Потому что две каскадные preg_matches нарушают логику и не работают.

Как смешивать проверку чар и проверять группы в «И» в одном регулярном выражении? Их позиции не имеют значения.

+0

Проще проверить допустимые символы и подстроки и свести на нет функцию preg_match в условии if. –

+0

Основная проблема (я думаю) заключается в том, что «делать» и «си» оба являются нераскрытыми символами ... – Random

ответ

1

Вы можете использовать этот шаблон:

return (bool) preg_match('~^(?:do|si|[a-gm0-9])*+\C~i', $inputStr); 

Идея заключается в том, чтобы соответствовать все разрешенные символы и подстроки с самого начала в повторяющейся группе с possessive quantifier и проверить, если один байт \C остается. Поскольку квантификатор является жадным и притяжательным, одиночный байт после, если он найден, не может быть разрешен.

Обратите внимание, что большую часть времени, это более просто свести на нет preg_match функции, например:

return (bool) !preg_match('~^(?:do|si|[a-gm0-9])*$~iD', $inputStr); 

(или с + квантора, если вы не хотите, чтобы пустые строки)

+1

У меня есть бесконечные отношения к вам, ребята, которые могут обрабатывать регулярные выражения таким образом ... что-то вроде волшебников или тому подобного. Он отлично подходит для обеих версий. Спасибо! – TechNyquist

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