PHP के साथ क्रॉन्टाब प्रविष्टि की पुष्टि करना



2 Answers

किसने कहा कि नियमित अभिव्यक्ति ऐसा नहीं कर सकती?

मेरे नियोक्ता के सौजन्य से, Salir.com , यहां एक PHPUnit परीक्षा है जो ऐसे सत्यापन करता है। संशोधित और वितरित करने के लिए स्वतंत्र महसूस करें अगर आप @ लेखक नोटिस और वेब साइट पर लिंक रखेंगे तो मैं सराहना करूंगा

<?php
/**
 * @author Jordi Salvat i Alabart - with thanks to <a href="www.salir.com">Salir.com</a>.
 */

abstract class CrontabChecker extends PHPUnit_Framework_TestCase {
    protected function assertFileIsValidUserCrontab($file) {
        $f= @fopen($file, 'r', 1);
        $this->assertTrue($f !== false, 'Crontab file must exist');
        while (($line= fgets($f)) !== false) {
            $this->assertLineIsValid($line);
        }
    }

    protected function assertLineIsValid($line) {
        $regexp= $this->buildRegexp();
        $this->assertTrue(preg_match("/$regexp/", $line) !== 0);
    }

    private function buildRegexp() {
        $numbers= array(
            'min'=>'[0-5]?\d',
            'hour'=>'[01]?\d|2[0-3]',
            'day'=>'0?[1-9]|[12]\d|3[01]',
            'month'=>'[1-9]|1[012]',
            'dow'=>'[0-7]'
        );

        foreach($numbers as $field=>$number) {
            $range= "($number)(-($number)(\/\d+)?)?";
            $field_re[$field]= "\*(\/\d+)?|$range(,$range)*";
        }

        $field_re['month'].='|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec';
        $field_re['dow'].='|mon|tue|wed|thu|fri|sat|sun';

        $fields_re= '('.join(')\s+(', $field_re).')';

        $replacements= '@reboot|@yearly|@annually|@monthly|@weekly|@daily|@midnight|@hourly';

        return '^\s*('.
                '$'.
                '|#'.
                '|\w+\s*='.
                "|$fields_re\s+\S".
                "|($replacements)\s+\S".
            ')';
    }
}
Question

PHP के साथ क्रॉन्टाब प्रविष्टि को मान्य करने का सबसे अच्छा तरीका क्या है? मैं एक regex, या एक बाहरी पुस्तकालय का उपयोग करना चाहिए? मुझे एक PHP स्क्रिप्ट मिल गई है जो किसी क्रॉन्टाब फ़ाइल से प्रविष्टियां जोड़ / हटाती है, लेकिन यह सत्यापित करने के लिए कुछ तरीका है कि समय अंतराल का भाग एक मान्य प्रारूप में है।




आप इसे regex के साथ काफी आसानी से करने में सक्षम होना चाहिए। वास्तव में, मुझे आश्चर्यचकित नहीं होगा यदि आप Google के लिए मौजूदा रेगेक्स ढूंढ सकते हैं यह अनचाहे है, लेकिन शायद कुछ ऐसा है:

/^((\*)|(\d+((-\d+)|(,\d+)+))\s+){5}/



पैटर्न का प्रयोग करें: /^((?:[1-9]?\d|\*)\s*(?:(?:[\/-][1-9]?\d)|(?:,[1-9]?\d)+)?\s*){5}$/

PHP में:

<?php 
$cron = "*/5 1-2 3 3,4,5 *"; 
$result = preg_match( "/^((?:[1-9]?\d|\*)\s*(?:(?:[\/-][1-9]?\d)|(?:,[1-9]?\d)+)?\s*){5}$/", $cron, $matches); 
print_r($matches);



Related