PHP 懒人正则

作者: 许一沐 | 来源:发表于2023-12-26 12:14 被阅读0次

    快速 字符串模组取值

    /**
         * 快速 字符串模组取值
         *
         * @param $string
         * @param $pattern
         * @param false $lowercase
         * @param null $whitespace
         * @param false $strip_val
         * @return array
         */
        public static function strQuickExtractValues($string, $pattern, $lowercase = false, $whitespace = null, $strip_val = false)
        {
            static $delimiters = ['{', '}'];
    
            $data = ['string' => $string, 'pattern' => $pattern, 'reg_pattern' => '', 'match' => []];
    
            $spRe = false;
    
            if (strpos($string, '/') !== false) {
                foreach (['~', ':', ';', '!', '@'] as $sp) {
                    if (strpos($string, $sp) === false) {
                        $spRe = $sp;
                        break;
                    }
                }
    
                $string = str_replace('/', $spRe, $string);
                $pattern = str_replace('/', $spRe, $pattern);
            }
    
            // Checking for lowercase conversion
            if ($lowercase) {
                $string = strtolower($string);
            }
    
            // Checking for a sequence in delimiters
            if (!is_array($delimiters) || count($delimiters) != 2) {
                return $data;
            }
    
            // Check if whitespace should be removed
            if (!is_null($whitespace)) {
                // Make sure it's an integer
                if (!is_int($whitespace)) {
                    return $data;
                }
    
                // Make sure it's a non-negative integer
                if ($whitespace < 0) {
                    return $data;
                }
    
                // Now remove whitespace
                if ($whitespace == 0) {
                    // Removing all whitespace from each value
                    $string = preg_replace('/\s/', '', $string);
                } else {
                    // Removing only extra whitespace from each value
                    $string = preg_replace(
                        '/(\s)\s{' . ($whitespace - 1) . ',}/', '\\1', $string
                    );
                }
            }
    
            // Helper regular expressions
            $splitter = '/(' . preg_quote($delimiters[0]) . '\w+' . preg_quote($delimiters[1]) . ')/';
            $extracter = '/' . preg_quote($delimiters[0]) . '(\w+)' . preg_quote($delimiters[1]) . '/';
    
            // Split pattern into parts including named groups
            $parts = preg_split($splitter, $pattern, -1, PREG_SPLIT_DELIM_CAPTURE);
    
            // Expand group or escape non-group
            foreach ($parts as &$p) {
                // Part is a named group
                if (preg_match($splitter, $p)) {
                    preg_match($extracter, $p, $matches);
                    $name = $matches[1];
                    $p = '(?P<' . $name . '>.+)';
                } // Part is something else
                else {
                    // Escape values with special semantics in regular expressions
                    $p = preg_quote($p);
                }
            }
            unset($p);
    
            // Build expanded pattern
            $data['reg_pattern'] = '/^' . implode('', $parts) . '$/';
    
            try {
                // Attempt to extract values
                preg_match($data['reg_pattern'], $string, $matches);
                $value_dict = array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY);
    
                foreach ($value_dict as $name => &$value) {
    
                    if ($spRe) {
                        $value = str_replace($spRe, '/', $value);
                    }
    
                    // Check if values must be stripped
                    if ($strip_val) {
                        $value = trim($value);
                    }
                }
    
                // Finally, return values
                $data['match'] = $value_dict;
            } catch (\Exception $e) {
            }
    
            return $data;
        }
    
    
        public static function strQuickExtractValuesTest()
        {
            print_r(self::strQuickExtractValues('/2012/08/12/test.html', '/{year}/{month}/{day}/{title}.html'));
            print_r(self::strQuickExtractValues('\2012\08\12\test.html', '\{year}\{month}\{day}\{title}.html'));
            print_r(self::strQuickExtractValues('John Doe <john@example.com> (http://example.com)', '{name} <{email}> ({url})'));
            print_r(self::strQuickExtractValues('from 4th October  to 10th  October', 'from {from} to {to}'));
            print_r(self::strQuickExtractValues('Convert 1500 Grams to Kilograms', 'convert {quantity} {from_unit} to {to_unit}', True));
            print_r(self::strQuickExtractValues('The time is 4:35pm here at Lima, Peru', 'The time is {time} here at {city}'));
        }
    

    相关文章

      网友评论

        本文标题:PHP 懒人正则

        本文链接:https://www.haomeiwen.com/subject/bhelndtx.html