В сочетании PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают время написания запросов.
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
Теперь предположим, что вы используете прямую переменную post в MySQL-запросе, тогда используйте ее следующим образом:
$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";
Это лучшая практика для использования переменных PHP в MySQL.
Если вы «должны» использовать регулярное выражение, пропустите проблему, проанализировав принятые перестановки.
«диапазон от -2055 до 2055» может быть выраженный как:
«Число от 0 до 2055» может быть одним из конечного числа конкретных перестановок:
Обратите внимание, что для этого регулярного выражения нет необходимости различать диапазон " 0-9 "и" 1-9 ", и только последние два диапазона имеют какие-либо ограничения на диапазон принятых цифр / символов (обозначенных звездочкой).
. Каждая из вышеуказанных составных частей легко индивидуально выразить как регулярное выражение:
. Соответствующим выражением для всего совпадения будет:
-?0*([0-9]|[0-9][0-9]|[0-9][0-9][0-9]|1[0-9][0-9][0-9]|20[0-4][0-9]|205[0-5])
Или немного более сжато:
-?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])
Предполагая , вход содержит только «число» и ничего больше, поэтому последнее регулярное выражение :
^-?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])$
Если необходимо разрешить знак ведущего плюса, это становится:
^[-+]?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])$
Вот сценарий js , демонстрирующий, что проходит и что не удастся последнему регулярному выражению.
Попробуйте с очень простым регулярным выражением.
^([-0][0-1][0-9][0-9][0-9])$|^([-0]20[0-4][0-9])$|^([-0]205[0-5])$
Визуальное представление
[/g0]
Это очень просто понять.
[-0][0-1][0-9][0-9][0-9]
будет охватывать [-1999, 1999] значения [-0]20[0-4][0-9]
будет охватывать [-2000, -2049] и [2000,2049] значения [-0]205[0-5]
будут отображаться [-2050, -2055] и [2050, 2055] значения blockquote>
String.format("%05d", number)
делают очень хорошоПример кода: (Читайте встроенные комментарии для большей ясности.)
int[] numbers = new int[] { -10002, -3000, -2056, -2055, -2000, -1999, -20, -1, 0, 1, 260, 1999, 2000, 2046, 2055, 2056, 2955, 3000, 10002, 123456 }; //valid range -2055 to 2055 inclusive Pattern p = Pattern.compile("^([-0][0-1][0-9][0-9][0-9])$|^([-0]20[0-4][0-9])$|^([-0]205[0-5])$"); for (int number : numbers) { String string = String.format("%05d", number); Matcher m = p.matcher(string); if (m.find()) { System.out.println(number + " is in range."); } else { System.out.println(number + " is not in range."); } }
output:
-10002 is not in range. -3000 is not in range. -2056 is not in range. -2055 is in range. -2000 is in range. -1999 is in range. -20 is in range. -1 is in range. 0 is in range. 1 is in range. 260 is in range. 1999 is in range. 2000 is in range. 2046 is in range. 2055 is in range. 2056 is not in range. 2955 is not in range. 3000 is not in range. 10002 is not in range. 123456 is not in range.
Чтобы быть ясным: если достаточно простого оператора if
if(num < -2055 || num > 2055) {
throw new IllegalArgumentException("num (" + num + ") must be between -2055 and 2055");
}
To ясно: если достаточно простого оператора if
, использование регулярных выражений для проверки числовых диапазонов не рекомендуется.
Кроме того, поскольку регулярные выражения анализируют строки, номера должны сначала переводиться в строку перед тем, как они могут быть протестированы. Исключением является то, что число уже является строкой, например, при получении пользовательского ввода с консоли.
(Чтобы гарантировать, что строка начинается с номера, вы можете использовать org.apache.commons.lang3.math.NumberUtils#isNumber(s)
)
Кроме того, поскольку регулярные выражения анализируют строки, номера сначала должны быть переведены в строку перед их тестированием. Исключение составляет то, что число уже является строкой, например, при получении пользовательского ввода с консоли.
Несмотря на это, выяснение того, как проверять диапазоны чисел с регулярными выражениями, является интересным и
(Ссылки в этом ответе взяты из Часто задаваемых вопросов регулярных выражений переполнения стека .)
(Чтобы гарантировать, что строка начинается с номера, вы можете использовать org.apache.commons.lang3.math.NumberUtils#isNumber(s)
)
\b15\b
Правило: Число должно быть точно 15
.
Самый простой диапазон. Регулярное выражение соответствует
Границы слова необходимы, чтобы избежать соответствия 15
внутри 8215242
.
\b(15|16)\b
\b1(5|6)\b
\b1[5-6]\b
Правило: Число должно быть между 15
и 16
. Вот три возможных регулярных выражения:
(Группы требуются для «или» -инга, но они могут быть не захватывающими : \b(?:15|16)\b
)
\b(\d|1[0-2])\b
\b( //The beginning of a word (or number), followed by either
\d // Any digit 0 through 9
| //Or
1[0-2] // A 1 followed by any digit between 0 and 2.
)\b //The end of a word
Правило: Число должно быть между -12
и 12
.
-?\b(\d|1[0-2])\b
Здесь является регулярным выражением для 0
через 12
, только с положительным значением:
Свободно-разнесенный:
(?<!-)\b(\d|1[0-2])\b
Выполнение этой работы как для отрицательной, так и для положительной так же просто, как добавление необязательная тире в начале:
(Предполагается, что перед тире не должно быть никаких недопустимых символов.)
Чтобы запретить отрицательные числа, отрицательный lookbehind необходимо:
Правило: Число должно быть между -12
и 12
.
Выход из внешнего вида приведет к тому, что 11
в -11
будет соответствовать. (Первый пример в этом сообщении должен содержать это.)
\d
по сравнению с [0-9]
Вот регулярное выражение для 0
- 12
, только для положительного:
(?<!-)\b([1-3]?\d{1,2}|400)\b
Чтобы быть совместимым со всеми ароматами регулярных выражений, все \d
-s следует изменить на [0-9]
. Например, .NET рассматривает не ASCII-номера, например, на разных языках, как законные значения для \d
. За исключением последнего примера, для краткости он оставлен как \d
.
(?<!-) //Something not preceded by a dash
\b( //Word-start, followed by either
[1-3]? // No digit, or the digit 1, 2, or 3
\d{1,2} // Followed by one or two digits (between 0 and 9)
| //Or
400 // The number 400
)\b //Word-end
Свободно-разнесенный:
\b(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255|256|257|258|259|260|261|262|263|264|265|266|267|268|269|270|271|272|273|274|275|276|277|278|279|280|281|282|283|284|285|286|287|288|289|290|291|292|293|294|295|296|297|298|299|300|301|302|303|304|305|306|307|308|309|310|311|312|313|314|315|316|317|318|319|320|321|322|323|324|325|326|327|328|329|330|331|332|333|334|335|336|337|338|339|340|341|342|343|344|345|346|347|348|349|350|351|352|353|354|355|356|357|358|359|360|361|362|363|364|365|366|367|368|369|370|371|372|373|374|375|376|377|378|379|380|381|382|383|384|385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400)\b
(С благодаря @TimPietzcker )
работа как с отрицательной, так и с положительной так же просто, как добавление опциональной в начале:
Правило: Должно быть между 0
и 400
.
(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?<!-)0+))\b
Возможное регулярное выражение:
Свободное разнесение:
Другая возможность, которая никогда не должна использоваться:
( //Capture group for the entire number
-?\b //Optional dash, followed by a word (number) boundary
(?:20 //Followed by "20", which is followed by one of
(?:5[0-5] //50 through 55
| //or
[0-4][0-9]) //00 through 49
| //or
1[0-9]{3} //a one followed by any three digits
| //or
[1-9][0-9]{0,2} //1-9 followed by 0 through 2 of any digit
| //or
(?<!-)0+ //one-or-more zeros *not* preceded by a dash
) //end "or" non-capture group
)\b //End number capture group, followed by a word-bound
Правило: Должно быть между -2055
и 2055
Это из вопроса в stackoverflow.
(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1?[0-9]{1,3})\b)
Regex:
-?\b(20(5[0-5]|[0-4][0-9])|1?[0-9]{1,3})\b
[/g29]
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.math.NumberUtils;
/**
<P>Confirm a user-input number is a valid number by reading a string an testing it is numeric before converting it to an it--this loops until a valid number is provided.</P>
<P>{@code java UserInputNumInRangeWRegex}</P>
**/
public class UserInputNumInRangeWRegex {
public static final void main(String[] ignored) {
int num = -1;
boolean isNum = false;
int iRangeMax = 2055;
//"": Dummy string, to reuse matcher
Matcher mtchrNumNegThrPos = Pattern.compile("(-?\\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?<!-)0+))\\b").matcher("");
do {
System.out.print("Enter a number between -" + iRangeMax + " and " + iRangeMax + ": ");
String strInput = (new Scanner(System.in)).next();
if(!NumberUtils.isNumber(strInput)) {
System.out.println("Not a number. Try again.");
} else if(!mtchrNumNegThrPos.reset(strInput).matches()) {
System.out.println("Not in range. Try again.");
} else {
//Safe to convert
num = Integer.parseInt(strInput);
isNum = true;
}
} while(!isNum);
System.out.println("Number: " + num);
}
Возможное регулярное выражение:
[C:\java_code\]java UserInputNumInRangeWRegex
Enter a number between -2055 and 2055: tuhet
Not a number. Try again.
Enter a number between -2055 and 2055: 283837483
Not in range. Try again.
Enter a number between -2055 and 2055: -200000
Not in range. Try again.
Enter a number between -2055 and 2055: -300
Number: -300
Свободно-разнесенный:
Свободный интервал:
(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?<!-)0+))\b
(Wi th благодаря PlasmaPower и Casimir et Hippolyte для помощи при отладке.)