Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 公式和给定字符的预匹配?_Php_Regex_Preg Match - Fatal编程技术网

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";
}