2015-03-27 3 views
1

Для начала я не использую регулярные выражения очень часто, поэтому я решил, что я выброшу это здесь.Регулярное выражение PHP с использованием Apostrophe Failed

У меня есть регулярное выражение, которое я использую, чтобы найти любые специальные символы, кроме тех, которые я бы хотел разрешить.

$allowed_special_characters_list = array('-', "'", '.'); 
$excluded_special_characters = ''; 

foreach($allowed_special_characters_list as $excluded_special_character){ 
    $excluded_special_characters .= "\\".$excluded_special_character; 
} 

if(preg_match("/[^\\w".$excluded_special_characters."\\s]/", $string)){ 
    return true; 
} 

Когда я выход это регулярное выражение, оно дает мне следующее:

/[^\w\-\'\.\s]/ 

Это, кажется, работает для всего, кроме апострофа в моем окружении. Однако, когда я помещаю это точное регулярное выражение в PHP Live Regex, он, кажется, работает со всем.

Любые идеи относительно того, что не так с этим?

Редактировать: Код, приведенный выше, является упрощенной версией того, что я на самом деле использую. Я динамически создаю это регулярное выражение из массива, который находится в файле конфигурации. В любое время, когда нам нужно добавить еще один специальный символ, нам нужно будет только ввести его в массив.

+0

Он работает для меня «var_dump (preg_match ('/ [^ \ w \ - \' \. \ S]/'," b &z")); 'return' int (1) 'и' var_dump (preg_match (' /[^\w\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ апостроф, а не точка, а не белый ar'. Кстати, вам не нужно скрывать символ '.' внутри символьного класса, и вы можете использовать' preg_quote() 'для автоматического экранирования. – piotrekkr

ответ

2

Логика выше, действительно, работает. Проблема связана с данными в строковой переменной $ в preg_match. Я должен был добавить html_entity_decode ($ NameAndAddressData, ENT_QUOTES) при настройке переменных имени и адреса.

0

Наиболее вероятная проблема с вашим регулярным выражением заключается в том, что вы смешиваете разрешенные и запрещенные символы внутри 1 регулярного выражения.

Вы исключаете все буквенно-цифровые символы с помощью [^\w], это не особый символ. Кроме того, проверьте, нужно ли также разрешить несколько слов, так как у вас есть \s внутри класса исключенных символов. И самое главное, что у вас есть отрицательный класс символов размером 1, что означает, что только один символ будет проверен во всей строке для соответствия, и я подозреваю, что вам нужно проверить, не все ли символы, принадлежащие исключенному класс.

Таким образом, регулярное выражение вам нужно что-то вроде ^[^\-\'\.\s]*$ (который запретит несколько слов, ведущий/конечные пробелы), и код, чтобы проверить, если слово подтверждено является:

$string = 'My bad string'; 
$string2 = 'Goodstring'; 
$re = "/^[^".$excluded_special_characters."\\s]*$/"; 
if(!preg_match($re, $string)){ 
    echo "false 1\n"; 
} 
if(preg_match($re, $string2)){ 
    echo "true 2\n"; 
} 

Выход:

false 1 ('My bad string' has spaces) 
true 2 ('Goodstring' is OK) 
+1

Я исключаю буквенно-цифровые символы и допускаю несколько слов по назначению. Это регулярное выражение рассматривает имена и адреса, чтобы увидеть, существуют ли какие-либо недопустимые символы. Существует два массива разрешенных специальных символов. Один для имен и один для адресов. Регулярное выражение построено так, чтобы быть динамичным для учета каждого специального символа, определенного в каждом массиве. С точностью до класса 1, с тем, что я только что описал, вы чувствуете, как будто это правильно, что цель состоит в том, чтобы увидеть, есть ли в строке какие-либо специальные символы **, кроме ** определенных в массивах? – Cory

+0

С моим комментарием выше, как вы думаете, как выглядит регулярное выражение? Спасибо за вашу помощь.Я действительно ценю это. – Cory

+0

Обратите внимание, что под «специальным символом» вы имеете в виду нечто отличное от '\ p {S}'. Теперь, чтобы проверить, есть ли какие-либо другие не '[a-zA-Z_]' s, цифры, (белое) пространство и $ excluded_special_characters, нет проблем с вашим регулярным выражением: '/ [^ \ w \ - \ «\. \ s] /'. Проблемы могут возникать при вводе: апострофы могут быть курчавыми, японскими и т. Д. –

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