在我的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个数字值和最后一个字母。
答案 0 :(得分:1)
$description = "3160 6392682B\nrinlraction\nE叠\narlairs&Lei sot les infractions provinsiales, Cour de jnstice de Ontarie Regt.";
字面匹配7位数字,然后是1个大写字母字符 :( Demo)
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
是名为“word boundary”的正则表达式字符。
在字符串的开头使用锚^
只有在您知道所需的子字符串跟随数字字符串和空格时才有用。
unicode标志是不必要的,因为你的PATTERN没有使用任何unicode字符。
您可以在regex101.com测试我的模式。只有在完全理解输入字符串($description
)的可变性后才能确定最准确和最有效的模式。我不会对字符串中的子字符串位置做任何假设。
我唯一能确定的是基于你提供的细节的匹配模式:7位数字,然后是1个大写字母。这正是我的第一,第二和第三种模式所做的。
Francesco的第一个模式将匹配:AAAAAAAAAAAAAAAAA
,11111111111111111111
,1A2S3D4F5G6H7J8K9L0
Francesco的第二种模式将匹配:ZZZZZZZZ
,99999999
,A1B2C3D4
这使得他的模式不准确/糟糕/误导,并可能教导未来SO读者糟糕的正则表达式实践......更不用说可能会污染你的项目了!