Php 公式和给定字符的预匹配?
我需要能够判断序列是否匹配,如下所示:Php 公式和给定字符的预匹配?,php,regex,preg-match,Php,Regex,Preg Match,我需要能够判断序列是否匹配,如下所示: $formula = 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX'; $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $serials = array( '9876-345-ABC', '7856Y-YURYW-00UEW-YUI23-YYYYY', '0934Y-R6834-27495-89999-11123' ); 因此,给定以下$serials数组,如何使用
$formula = 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$serials = array(
'9876-345-ABC',
'7856Y-YURYW-00UEW-YUI23-YYYYY',
'0934Y-R6834-27495-89999-11123'
);
因此,给定以下$serials
数组,如何使用指定的公式为所有与$chars
中任何字符匹配的值返回true,其中X
是$chars
中任何字符的占位符。但我还需要确保公式中的连字符在给定序列值中的正确位置
foreach($serials as $serial)
{
if(preg_match("???", $serial) === 0)
echo 'found';
}
应在$serials
的最后两个元素上找到echo。看起来很简单,但不管我怎么努力,我还是无法理解正则表达式。你可以选择(在多行模式下)
:
由于wonderful目前似乎不起作用,这里是一个非图形化的正则表达式示例。它将与末尾带有星号的匹配:
9876-345-ABC *
7856Y-YURYW-00UEW-YUI23-YYYYY *
0934Y-R6834-27495-89999-11123 *
this-one-not
this one neither
翻译成PHP,这将是:
$regex = '~^(?:[0-9A-Z]{3,5}-?){3,5}$~';
if (preg_match($regex, $string)) {
echo "This is a valid serial";
}
found - 7856Y-YURYW-00UEW-YUI23-YYYYY
found - 0934Y-R6834-27495-89999-11123
您可以这样做,它将在连续的X上使用“{}”
/**
* $formula = 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX';
* $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
* $serials = array(
* '9876-345-ABC',
* '7856Y-YURYW-00UEW-YUI23-YYYYY',
* '0934Y-R6834-27495-89999-11123'
* );
*/
function checkThisFormula($formula, $chars, array $serials) {
$formulaLength = strlen($formula);
$regex = "";
$charsRegex = "[".$chars."]";
$lastIsX = false;
$nbX = 0;
// let's construct the regex from formula
for($i = 0; $i < $formulaLength; $i++) {
if($formula[$i] === 'X') {
// let's count how many X we see before writing
$nbX++;
$lastIsX = true;
} else {
if($lastIsX) {
// end of successive Xs
$regex .= "[".$chars."]";
if($nbX > 1) {
$regex .= "{".$nbX."}";
}
// reinit X count
$lastIsX = false;
$nbX = 0;
}
// have to be this exact char
$regex .= '\\'.$formula[$i];
}
}
if($lastIsX) {
// if the last char is an X, have to write it too !
$regex .= "[".$chars."]";
if($nbX > 1) {
$regex .= "{".$nbX."}";
}
}
// let's make the regex with flag for case insensitive
$regex = "#".$regex."#i";
$result = array();
// let's loop on every serial to test it
foreach($serials as $serial) {
$result[$serial] = preg_match($regex, $serial);
}
return $result;
}
我认为最简单的方法是:
foreach($serials as $serial)
{
if(preg_match("/([$chars]{5}-){4}[$chars]{5}/", $serial) == 1)
echo 'found - '.$serial.'<br>';
}
foreach($serials作为$serial)
{
如果(preg_match(“/([$chars]{5}-{4}[$chars]{5}/”,$serial)==1)
回显“找到-”.$serial.“
”;
}
结果将是:
$regex = '~^(?:[0-9A-Z]{3,5}-?){3,5}$~';
if (preg_match($regex, $string)) {
echo "This is a valid serial";
}
found - 7856Y-YURYW-00UEW-YUI23-YYYYY
found - 0934Y-R6834-27495-89999-11123
发现-7856Y-YURYW-00UEW-YUI23-YYYY
发现-0934Y-R6834-27495-89999-11123
我希望这就是你想要做的。当然不是最好的,但是给它一个机会和评论 假设:-
公式
仅包含X的
$formula = 'XXX-XX-XXX-X-XXXXX';
$parts = split("\-", $formula);
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$reg = '';
foreach ($parts as $x) {
$reg = $reg . "" . '[' . "" . $chars . "" . ']{' . "" . strlen($x) . "" . "}" . "" . "-";
}
$reg = substr_replace($reg, '', -1);
$serials = array(
'9876-345-ABC',
'7856Y-YUR-00W-YUI23-YYY',
'0934Y-R6834-27495-89999-11123',
'XXX-XX-XXX-X-XXXXX'
);
$reg = '/^' . "" . $reg . "" . '$/';;
foreach($serials as $serial) {
if(preg_match($reg, $serial) != 0) {
echo $serial;
echo "\n";
}
}
这是一个非常简单的正则表达式。。。你应该在google中键入“regex example”,并找到大量这样做的示例…
^([A-Z0-9]{5}-{4}[A-Z0-9]{5}$
我需要直接按原样插入$formula
和$chars
直接按原样插入preg\u match
,如何$formula
和$chars
是用户定义的变量。真的可以是任何东西。你至少可以尝试一些东西。提示:您可以从$chars
创建一个字符类,并用该字符类替换每个X
。并使用该正则表达式来preg\u grep
2个值。至少是这样。很抱歉问一下,我尝试过不同的方法,但我认为使用preg\u match
,如果我只知道如何在这个意义上使用它,会更有效。嗯?你发了什么?你的回答把我弄糊涂了。@SolomonClosson:一个用来验证你的连载的正则表达式。不幸的是,regex101.com引擎目前似乎无法运行。@SolomonClosson:请使用PHP
code查看更新后的答案。感谢您的帮助,不确定您发布的内容是否能实现以下功能?我需要匹配$formula的模式值,而$formula可以是任何东西。但是$formula总是使用X字符作为占位符,使用连字符作为分隔符,然后我需要只匹配$chars变量中指定的字符,不区分大小写。不幸的是,$formula
可能是任何字符。哦,我明白了。。。所以我想没有办法避免笨拙的代码包含循环。哇,这是一个有趣的方法@SolomonClosson(至少,fast:)可能需要在这里执行不区分大小写的操作。。。所以A
应该与A
和A
匹配。您可以让formula Uppercase乐于提供帮助!我同意你的意见:)谢谢你。这正是我想要的@SolomonClosson很高兴它能帮上忙。别忘了接受。谢谢!你太棒了!我喜欢你的和@splash58,但我只能选择一个答案:(@SolomonClosson没问题..我很高兴能提供一个基于regex
的解决方案,我就是为此而来的
$formula = 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$serials = array(
'9876-345-ABC',
'7856Y-YURYW-00UEW-YUI23-YYYYY',
'0934Y-R6834-27495-89999-11123'
);
foreach($serials as $serial) {
$str = str_replace(str_split($chars), 'X', $serial);
echo $str == $formula ? "yes" : "no";
}