В моем тексте OCR я получаю вывод, как это …
"responses": [
{
"textAnnotations": [
{
"locale": "fr",
"description": "3160 6392682B\nrinlraction\nE叠\narlairs&Lei sot les infractions provinsiales, Cour de jnstice de Ontarie Regt.
Я хочу получить значение «6392682B» (8 буквенно-цифровых символов). Числа и последний символ будут отличаться на разных изображениях. Единственная стандартная часть — это длина, которая составляет 8 символов (первые 7 будут цифрами, а последняя — буквой).
Я пробовал с:
preg_match_all("/(\d{7})/", $str, $ar);
Первые 7 числовых значений и последний алфавит.
$description = "3160 6392682B\nrinlraction\nE叠\narlairs&Lei sot les infractions provinsiales, Cour de jnstice de Ontarie Regt.";
Буквально соответствует 7 цифрам, затем 1 заглавному алфавитному символу: (демонстрация)
echo preg_match('/\d{7}[A-Z]/',$description,$out)?$out[0]:'not found';
Если вы знаете, что ваша подстрока следует сразу за первой строкой чисел и пробелом:
echo preg_match('/\d+ \K\d{7}[A-Z]/',$description,$out)?$out[0]:'not found';
Если вам нужно установить некоторые границы, чтобы в подстроке не было начальных или конечных символов:
echo preg_match('/\b\d{7}[A-Z]\b/',$description,$out)?$out[0]:'not found';
Это проверит, что последовательность цифр не 8 или более и что нет буквенно-цифрового символа или подчеркивания после заглавной буквы желаемой подстроки.
Если вы знаете положение своей подстроки, вы можете даже сопоставить ее на основе предшествующих символов & следуй за ним:
echo preg_match('/ \K[^\n]+/',$description,$out)?$out[0]:'not found';
Некоторые дополнительные уточнения:
\K
указывает, где начинать совпадение полной строки, поэтому нет необходимости в группе захвата.
\b
это метасимвол регулярного выражения, называемый «граница слова».
Использование якоря ^
в начале строки полезно только в том случае, если вы ЗНАЕТЕ, что искомая подстрока следует за строкой чисел и пробелом.
Флаг Юникода не нужен, потому что в вашем ШАБЛОНЕ нет символов Юникода.
Вы можете проверить мои образцы в regex101.com Выбор наиболее точного и эффективного шаблона может быть определен только после полного понимания изменчивости вашей входной строки ($description
). Я не буду делать никаких предположений о положении подстроки в строке.
Единственное, в чем я могу быть абсолютно уверен — это шаблон сопоставления, основанный на предоставленных вами данных: 7 цифр и 1 заглавная буква. Это именно то, что делают мои первый, второй и третий паттерны.
Первый образец Франческо будет соответствовать: AAAAAAAAAAAAAAAAA
, 11111111111111111111
, 1A2S3D4F5G6H7J8K9L0
Второй шаблон Франческо будет соответствовать: ZZZZZZZZ
, 99999999
, A1B2C3D4
Это делает его схему неточной / плохой / вводящей в заблуждение, и, вероятно, научит будущих читателей SO плохим практикам регулярных выражений … не говоря уже о том, что может испортить ваш проект!
Других решений пока нет …