как использовать регулярное выражение для приведенного ниже материала в php

#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 (.*)$/ работает:

  1. Строка должна начинаться ( ^ ) ровно с одного nm
  2. Шаблон должен продолжаться хотя бы одним 0
  3. В первом ненулевом символе после nm0 … запишите значение (это работа круглых скобок)
  4. Продолжайте до конца строки ( $ )

Комментарии:

1. Когда он достигнет 7-значного идентификатора, это регулярное выражение завершится ошибкой