Как использовать квадратную скобку внутри класса PHP Regex? - PullRequest
1 голос
/ 14 февраля 2010

Я хотел бы добавить [и] в мое проверочное регулярное выражение, которое уже принимает все числовые, подчеркивания, точки и буквенно-цифровые символы.

Вот регулярное выражение: $ regex = "^ [._ a-zA-Z0-9 -] * $";

Но когда я пытаюсь:

$regex = "^[.\\[\\]_a-zA-Z0-9-]*$";

или

$regex = "^[.\[\]_a-zA-Z0-9-]*$";

Это не работает (я читал удвоение escape в PHP для скобок, но это не работает!

Я использую eregi.

Есть идеи?

Тест:

<?php
//$regex = "^[_a-zA-Z0-9-]*$";
$regex = "^[.\\[\\]_a-zA-Z0-9-]*$";
echo("1".(eregi($regex, "patrick")?"True":"False"));//Should return True
echo("<br>");
echo("2".(eregi($regex, "p@trick")?"True":"False"));
echo("<br>");
echo("3".(eregi($regex, "pat rick")?"True":"False"));
echo("<br>");
echo("4".(eregi($regex, "patr'ick")?"True":"False"));
echo("<br>");
echo("5".(eregi($regex, "pAtr'ick")?"True":"False"));
echo("<br>");
echo("6".(eregi($regex, "pAtr_ick")?"True":"False"));//Should return True
echo("<br>");
echo("7".(eregi($regex, "pA-tr_ick")?"True":"False"));//Should return True
echo("<br>");
echo("8".(eregi($regex, "pAaAta   atrack")?"True":"False"));
echo("<br>");
echo("9".(eregi($regex, "pA%k")?"True":"False"));
echo("<br>");
echo("10".(eregi($regex, "patrick.second")?"True":"False")); //Should return True
echo("<br>");
echo("11".(eregi($regex, "[Pat]Rick")?"True":"False"));//Should return True
echo("<br>");
?>

Ответы [ 5 ]

3 голосов
/ 14 февраля 2010

Первый должен работать. Вам нужно использовать две обратные косые черты: одну для escape-выражения регулярного выражения и одну для escape-строки. Просто посмотрите, как это оценивается:

echo "^[.\\[\\]_a-zA-Z0-9-]*$"; // => ^[.\[\]_a-zA-Z0-9-]*$

И это именно то, что вам нужно.


Редактировать Использовать preg_match вместо:

preg_match("/^[.\\[\\]_a-zA-Z0-9-]*$/i", $str)

Я не знаю, почему это регулярное выражение не работает с eregi, а с preg_match. Более того, функции POSIX ERE устарели и будут удалены PHP 6 в пользу функций PCRE . Обратите внимание, что регулярные выражения PCRE используют разделители для включения регулярного выражения и отделения его от модификаторов .

1 голос
/ 14 февраля 2010

Не совсем ответ, но полезный совет: используйте одинарные кавычки вокруг регулярных выражений (если они не требуют разбора php), чтобы вам не пришлось делать дополнительный слой экранирования Только одна кавычка требует экранирования в строке с одинарными кавычками. (строки php)

Кроме того, семейство функций ereg находится на выходе . Почему бы не использовать preg_match с символом «i» после закрывающей косой черты для обозначения нечувствительного к регистру совпадения?

1 голос
/ 14 февраля 2010

Вам нужно экранировать $, если оно в двойных кавычках.

Например: *. * 1004

$regex = "^[.\\[\\]_a-zA-Z0-9-]*\$";
0 голосов
/ 14 февраля 2010

Экранирование внутри скобок не работает с ereg (он трактует \ как буквенный символ). ']' всегда следует указывать в скобках как первый символ, а '[' может быть где угодно:

$regex = "^[]._[a-zA-Z0-9-]*$";

Однако лучше перейти на preg_match, поскольку ereg устарел в PHP 5.3 и будет удален в PHP6.

0 голосов
/ 14 февраля 2010

Вы не можете экранировать символы в выражении в скобках при использовании функций ereg. Используйте этот шаблон вместо:

$regex = "^[]._[a-zA-Z0-9-]*$";

Вы можете понять, почему это работает, прочитав часть о выражениях в скобках в regex man page .

В любом случае, было бы лучше просто переключиться на функции PCRE вместо этого, поскольку eregi теперь устарела в PHP 5.3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...