第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將文件名與通配符匹配時,正則表達(dá)式無法按預(yù)期工作

將文件名與通配符匹配時,正則表達(dá)式無法按預(yù)期工作

PHP
一只斗牛犬 2023-06-18 16:25:40
我正在編寫一個 PHP 函數(shù),它接受一個文件名數(shù)組,如果文件名與用戶輸入的一組條件不匹配,則從該數(shù)組中刪除文件名。該函數(shù)遍歷數(shù)組并將每個值與正則表達(dá)式進(jìn)行比較。正則表達(dá)式是通過插入來自用戶輸入的變量而形成的。如果用戶沒有指定變量,則在變量的位置插入正則表達(dá)式通配符。文件名都非常系統(tǒng)化,所以2020-06-N-1.txt我確切地知道文件名和用戶輸入中預(yù)期有多少個字符。但是,當(dāng)我運行代碼時,與正則表達(dá)式不匹配的文件名仍在數(shù)組中。刪除了一些不匹配的文件名,但保留了許多其他文件名。下面是我的部分 PHP 代碼。任何幫助表示贊賞。function fileFilter() {    global $fileArray, $fileFilterPattern;        /* The loop starts at 2 and goes to count()-1 because the first 2 elements were removed earlier with unset */    for ($j = 2; $j < count($fileArray) - 1; $j++) {        if(!(preg_match($fileFilterPattern, $fileArray[$j]))) {            unset($fileArray[$j]);        }    }    return;}// If user does not provide a filter value, it gets converted into wildcard symbolif ($month == '') {    $month = '..';}if ($year == '') {    $year = '....';}if ($section == '') {    $section = '.';}$fileFilterPattern = "/{$year}-{$month}-{$section}-.\.txt/";/* function only runs if user applied at least one filter */if (!($month == '..' && $year == '....' && $section == '.')) {    fileFilter();}下面我提供了一個示例,說明數(shù)組如何包含不匹配的元素。我使用我的輸出數(shù)組echo json_encode($fileArray);我的輸入:月是"" 年是""節(jié)是"L"預(yù)期結(jié)果:數(shù)組僅包含在部分 spot ( YEAR-MONTH-**SECTION**-NUMBER.txt)中具有 L 的文件結(jié)果數(shù)組:{"8":"2020-06-L-1.txt","9":"2020-06-L-2.txt","10":"2020-06-L-3.txt","11":"2020-06-L-4.txt","12":"2020-06-L-5.txt","15":"2020-06-N-3.txt","16":"2020-06-N-4.txt","17":"2020-06-N-5.txt","18":"2020-06-N-6.txt","19":"2020-06-O-1.txt","20":"2020-06-O-2.txt","21":"2020-06-O-3.txt","22":"2020-06-O-4.txt","23":"2020-06-S-1.txt","24":"2020-06-S-2.txt","25":"2020-06-S-3.txt"}
查看完整描述

2 回答

?
喵喵時光機

TA貢獻(xiàn)1846條經(jīng)驗 獲得超7個贊

問題是在循環(huán)中使用 unset() 。在下一次迭代中,索引不再與您使用 unset() 破壞數(shù)組之前的索引相同。有時,您可以使用 array_values() 來處理這個問題,但在這種情況下,只構(gòu)建第二個僅包含您想要的值的數(shù)組會更簡單。以下代碼有效。我使用 array_values() 只是為了獲取您提供的字符串并使索引恢復(fù)正常。


也就是說,由于“前 2 個元素之前已使用 unset 刪除”,因此您需要在到達(dá)此部分之前對數(shù)組運行 array_values() 。


<?php


$str ='{"8":"2020-06-L-1.txt","9":"2020-06-L-2.txt","10":"2020-06-L-3.txt","11":"2020-06-L-4.txt","12":"2020-06-L-5.txt","15":"2020-06-N-3.txt","16":"2020-06-N-4.txt","17":"2020-06-N-5.txt","18":"2020-06-N-6.txt","19":"2020-06-O-1.txt","20":"2020-06-O-2.txt","21":"2020-06-O-3.txt","22":"2020-06-O-4.txt","23":"2020-06-S-1.txt","24":"2020-06-S-2.txt","25":"2020-06-S-3.txt"}';


$fileArray = json_decode($str, true);

$fileArray = array_values($fileArray);


echo '<p>fileArray: ';

var_dump($fileArray);

echo '</p>';


function fileFilter() {

    global $fileArray, $fileFilterPattern;

    $filteredArray = [];


    for ($j = 0; $j < count($fileArray); $j++) {

        if(preg_match($fileFilterPattern, $fileArray[$j]) === 1) {

            //unset($fileArray[$j]);

            array_push($filteredArray, $fileArray[$j]);

        }

    }

    echo '<p>filteredArray: ';

    var_dump($filteredArray);

    echo '</p>';

    //return;

}


$month =='';

$year = '';

// If user does not provide a filter value, it gets converted into wildcard symbol

if ($month == '') {

    $month = '..';

}

if ($year == '') {

    $year = '....';

}

if ($section == '') {

    $section = '.';

}


$section = 'L';


$fileFilterPattern = "#{$year}-{$month}-{$section}-.\.txt#";


echo '<p>fileFilterPattern: ';

var_dump($fileFilterPattern);

echo '</p>';


/* function only runs if user applied at least one filter */

if (!($month == '..' && $year == '....' && $section == '.')) {

    fileFilter();

}

?>


查看完整回答
反對 回復(fù) 2023-06-18
?
慕桂英546537

TA貢獻(xiàn)1848條經(jīng)驗 獲得超10個贊

主要問題是count每次減少unset,所以你應(yīng)該定義一次計數(shù)。假設(shè)-1和$j = 2對于您的場景是正確的:


$count = count($fileArray) - 1;


for ($j = 2; $j < $count; $j++) {

    if(!(preg_match($fileFilterPattern, $fileArray[$j]))) {

        unset($fileArray[$j]);

    }

}

還有其他方法,您不必假設(shè)然后跟蹤密鑰:


foreach($fileArray as $k => $v) {

    if(!preg_match($fileFilterPattern, $v)) {

        unset($fileArray[$k]);

    }

}

我會擺脫你的fileFilter功能并改用這個方便的功能,它將返回與模式匹配的所有項目:


$fileArray = preg_grep($fileFilterPattern, $fileArray);


查看完整回答
反對 回復(fù) 2023-06-18
  • 2 回答
  • 0 關(guān)注
  • 248 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號