Я новичок и немного отстранен, поэтому, пожалуйста, прости меня за вопрос, который покажется мне совершенно глупым.
В PHP я пытаюсь использовать регулярное выражение для сопоставления, когда двойная кавычка «появляется в тексте из элемента управления в форме HTML и позволяет его использовать. Текущее регулярное выражение не работает:
preg_match('/[^a-zA-Z0-9 \"\'\?\-]/', $v)
так как все остальные символы работают нормально, но если я добавлю «в тексте», он все равно не сможет выполнить регулярное выражение.
я пробовал [^a-zA-Z0-9 \"\'\?\-]
на https://regex101.com/, и, кажется, работает нормально. Что-то не так с моим экземпляром PHP, который нужно исправить, или PHP каким-то образом не работает согласованно с https://regex101.com/?
Ян Дж.
Редактировать:
Вход: тест »
Выход: 10
Редактировать:
$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> <span class='errorextra'>(Please enter only upper or lower case letters, numerals, spaces, and basic punctuation, maximum ".$n." characters)</span>";
}
return $s;
}
Редактировать: ОК, похоже, что между значением $ _POST и передачей переменной происходит нечто странное. Я должен буду исследовать и вернуться. Но пока этот вопрос приостановлен.
Редактировать: некоторые первоначальные исследования указывают на преобразование, происходящее при вызове htmlentities ранее в коде, делающем преобразование двойной кавычки во что-то еще. Поэтому я не думаю, что это проблема регулярных выражений. Я пометил «beiller» как ответ из-за его примера кода, который помог мне найти причину проблемы.
Ваш вопрос немного сбивает с толку, поэтому позвольте мне описать, что делает ваше регулярное выражение:
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> <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:
Одна из важных особенностей регулярного выражения — это то, что они ищут любой подстрока вашего предмета, которая соответствует заданному шаблону. Поэтому, если вы хотите разрешить, скажем, алфавитные символы, пробел и двойные кавычки, ищите все, что не в пределах ваших разрешенных символов и отрицайте результат 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)
это код, который я использую, и он работает нормально
function somefunc($value)
{
$result= preg_replace("#[?.&,;\"\'@\-_ \/]#", " ", $value);
return $result;
}
Надеюсь, это поможет.