我正在编写一个php脚本,它将遍历数据库中的所有表,并查找纯文本信用卡号。为此,我使用MySQL REGEXP。我只需要那些“只”包含信用卡号码的结果。如果有任何包含信用卡号码的文本数据,那么脚本不应该考虑它。
例如:
商业、金融、商业、商业、金融、商业、商业等行业
/.=
/.=‘2’>
=
如果查询是在上面的表上进行三重排列的,那么它应该返回前3条记录,而不应该返回第4条记录。为此,我使用下面的查询,而我面临的问题是查询返回了所有4条记录。
SELECT ccno FROM aacc WHERE
(ccno = REGEXP '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
OR ccno = REGEXP '[0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]'
OR ccno = REGEXP '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]')
发布于 2018-09-27 13:17:08
已知有一些复杂的正则表达式可以匹配来自大型信用卡提供商(如Visa和MasterCard )的信用卡号码。就您的问题而言,下面的模式与您想要的非常接近:
SELECT *
FROM yourTable
WHERE ccno REGEXP '^[0-9]{4}([[:space:]-]?[0-9]{4}){3}$';
演示
这个模式并不准确,但是您的数据没有一个匹配,例如,带有dddd-dddddd-ddddd
格式的美国运通卡,有两个破折号,而不是三个。如果您计划使用生产数据进行此操作,则应研究如何将信用卡号码与regex匹配。
发布于 2018-09-27 13:11:40
发布于 2018-09-28 10:45:38
虽然上面的两个答案帮助我实现了我想要的结果,但我现在已经写了完整的查询,这将给出与纯文本信用卡完全匹配的内容。在此查询中工作正常的卡片如下:
美国运通
签证
MasterCard
发现
MySQL查询是:
SELECT *
FROM yourTable
WHERE (ccno REGEXP '^4[0-9]{3}([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^3[47][0-9]{2}[[:space:]-]?[0-9]{6}[[:space:]-]?[0-9]{5}$'
OR ccno REGEXP '^6011([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^65[0-9]{2}([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^5[1-5][0-9]{2}([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^222[1-9]([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^2[3-6][0-9]{2}([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^27[01][0-9]([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^2720([[:space:]-]?[0-9]{4}){3}$'
);
工作示例可以看到这里。
https://stackoverflow.com/questions/52537762
复制相似问题