2015-05-27 3 views
0

Я новичок и немного тупица регулярного выражения, поэтому, пожалуйста, простите мне, что будет казаться совершенно глупым вопросом. .PHP preg_match двойная кавычка совпадение

В PHP я пытаюсь использовать регулярное выражение, чтобы соответствовать когда двойные кавычки "появляется в тексте от управления на HTML форме и позволяют использовать его в настоящее время регулярное выражение не работает:

preg_match('/[^a-zA-Z0-9 \"\'\?\-]/', $v) 

как все остальные символы работают нормально, но если я поместил «текст», он все равно не выполнит регулярное выражение.

Я пробовал [^a-zA-Z0-9 \"\'\?\-] на https://regex101.com/, и он работает нормально. Что-то не так с моим PHP-экземпляром, который нуждается в исправлении, или PHP каким-то образом не работает с https://regex101.com/?

Ian J.

Edit:

Входной сигнал: тест»

Выход: 10

Edit:

$v = test" 
$n = 50 
$s = Name: 
$f = $fail (which is passed by reference as a counter) 

function validate_text($v, $n, $s, &$f) 
{ 
    if ($v == "") 
    { 
     ++$f; 
     return "<span class='error'>".$s."</span>"; 
    } 
    elseif ((strlen($v) > $n) || preg_match('/[^a-zA-Z0-9 \"\'\?\-]/', $v)) 
    { 
     ++$f; 
     return "<span class='error'>".$s."</span>&nbsp;<span class='errorextra'>(Please enter only upper or lower case letters, numerals, spaces, and basic punctuation, maximum ".$n." characters)</span>"; 
    } 
    return $s; 
} 

Edit: Хорошо, это кажется, что есть что-то странное происходит между значением $ _POST и переходит к переменной. исследовать и возвращаться. Но на данный момент этот вопрос приостановлен.

Редактировать: некоторые исходные точки исследования указывают на преобразование, возникающее при вызове htmlentities ранее в коде, выполняющем преобразование двойной кавычки в другое. Поэтому я не думаю, что это проблема с регулярным выражением. Я отметил «beiller» как ответ из-за его примера кода, который поставил меня на путь поиска, где проблема на самом деле.

+0

Оригинальный пост отредактирован для ввода/вывода –

+1

Но проверить на наличие '«'' в тесте»' вам не нужно регулярное выражение. Используйте функции 'strchr' или' strstr' – anubhava

+0

Я использую регулярное выражение для других вещей, а не только « –

ответ

1

Ваш вопрос немного запутанным, поэтому позвольте мне описать то, что регулярное выражение делает:

preg_match('/[^a-zA-Z0-9 \"\'\?\-]/', $v) 

Это будет соответствовать любой строке, которая не содержит a-zA-Z0-9 \"\'\?\-

Также вы спасаясь ваши " с \", который не обязательно. Попробуйте удалить обратную косую черту.

Ввод test" не должен соответствовать этому регулярному выражению, поскольку он содержит букву «t».

Я сделал еще одну попытку, но ответил слишком быстро. Попробуйте следующий код:

$v = 'test"'; 
$n = 50; 
$s = 'Name:'; 
$f = 0; 

function validate_text($v, $n, $s, &$f) 
{ 
    if ($v == "") 
    { 
     ++$f; 
     return "<span class='error'>".$s."</span>"; 
    } 
    elseif ((strlen($v) > $n) || preg_match('/[^a-zA-Z0-9 "\'\?\-]/', $v)) 
    { 
     ++$f; 
     return "<span class='error'>".$s."</span>&nbsp;<span class='errorextra'>(Please enter only upper or lower case letters, numerals, spaces, and basic punctuation, maximum ".$n." characters)</span>"; 
    } 
    return $s; 
} 

echo validate_text($v, $n, $s, $f); 

Выход:

Name: 
+0

Правильно, я пытаюсь найти любые символы, кроме как в регулярном выражении, и не возвращать вход пользователю, чтобы они не могли их использовать. Я хочу, чтобы они могли использовать ", но не $ или% или^или &, например. –

+0

Я попробовал' preg_match ('/^[a-zA-Z0-9 \ "\' \? \ -] +/', $ v) 'и он все еще не работает –

+0

Проверка strlen выполняется, если входное значение превышает 50, что если так возвращает TRUE, что вызывает ошибку. test "- всего 5 символов, поэтому возвращается FALSE, а затем проверяется preg_match. –

0

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

var_dump(!preg_match('/[^[:alnum:] "]+/', 'lorem ipsum dolor si amet 42')); 
=> bool(true) 
var_dump(!preg_match('/[^[:alnum:] "]+/', 'lorem ipsum "dolor" si amet')); 
=> bool(true) 
var_dump(!preg_match('/[^[:alnum:] "]+/', 'lorem&ipsum "do^or" +si amet')); 
=> bool(false) 
Смежные вопросы