#php
#php
Вопрос:
У меня есть база данных из более чем 70000 записей, и значение ее первичного ключа начинается с 1 однозначной цифры.
Итак, я хочу, чтобы пользователь вводил nm0000001
вместо 1
в URL.И в части кода я должен отбросить остальное значение, за исключением 1
.
Но моя проблема в том, что я хочу, чтобы в строке такого типа было 9 букв, а шаблон был таким
1 - nm0000001
9 - nm0000009
10 - nm0000010
2020 - nm0002020
И из приведенного выше шаблона мне нужны только цифры, подобные 1,9,10,2020
в php.
Ответ №1:
Здесь:
$i = (int)substr($input, 2);
Вообще нет причин использовать регулярные выражения.
В любом случае, если вы настаиваете на использовании regexp, то:
$input = 'nm0002020';
preg_match('~0*(d )$~', $input, $matches);
var_dump($matches[1]);
Комментарии:
1. я думаю, вы не получили мой вопрос. Я не упоминаю, что начальная позиция из 2.
2. @pravat231 «Начальная позиция с 2» обрезает «nm» с самого начала
3. @pravat231: ну, я понял это в соответствии с тем, как вы это описали. И, похоже, 2 других парня поняли это таким же образом. Итак, вам нужно перефразировать свой вопрос, чтобы получить другие ответы.
Ответ №2:
Предполагая, что значение получено в URL в качестве параметра querystring, то есть передается через $_GET['id']
или какое-либо другое имя, отличное от id
:
// Trim the "nm" off the front
$pk = substr($_GET['id'],2);
// And parse out an integer value.
$id = intval($pk);
Комментарии:
1. Я думаю, что его проблема в том, что он не знает, где заканчивается 0 и начинается фактический идентификатор. Вот почему он пытается использовать регулярное выражение.
2. @Zach не имеет значения. Если вы обрежете nm спереди,
intval
приведете оставшуюся часть числа к соответствующему целому числу, независимо от того, сколько нулей заполняет перед ним. Пример:echo intval("000023345");
печатает23345
.3. Изначально это тоже была моя идея. Избегайте использования регулярных выражений, когда это возможно!
Ответ №3:
В этом нет абсолютно никакой пользы для регулярных выражений — используйте sprintf("nmd", ...)
для форматирования и просто substr
и приведение к int для синтаксического анализа.
Ответ №4:
Эта функция сделает свое дело:
function extractID($pInput)
{
$Matches = array();
preg_match('/^nm0*(.*)$/', $pInput, $Matches);
return intval($Matches[1]);
}
Вот почему /^nm0 (.*)$/
работает:
- Строка должна начинаться (
^
) ровно с одногоnm
- Шаблон должен продолжаться хотя бы одним
0
- В первом ненулевом символе после
nm0
… запишите значение (это работа круглых скобок) - Продолжайте до конца строки (
$
)
Комментарии:
1. Когда он достигнет 7-значного идентификатора, это регулярное выражение завершится ошибкой