regex — совпадение двойных кавычек в PHP preg_match

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

В 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>&nbsp;<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» как ответ из-за его примера кода, который помог мне найти причину проблемы.

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:
1

Другие решения

Одна из важных особенностей регулярного выражения — это то, что они ищут любой подстрока вашего предмета, которая соответствует заданному шаблону. Поэтому, если вы хотите разрешить, скажем, алфавитные символы, пробел и двойные кавычки, ищите все, что не в пределах ваших разрешенных символов и отрицайте результат 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)
0

это код, который я использую, и он работает нормально

function somefunc($value)
{
$result= preg_replace("#[?.&,;\"\'@\-_ \/]#", " ", $value);
return $result;
}

Надеюсь, это поможет.

0
По вопросам рекламы [email protected]