<?php /** * @package Joomla * @subpackage CoalaWeb Library * @author Steven Palmer <support@coalaweb.com> * @link https://coalaweb.com/ * @license GNU/GPL V3 or later; https://www.gnu.org/licenses/gpl-3.0.html * @copyright Copyright (c) 2020 Steven Palmer All rights reserved. * * CoalaWeb Library is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ namespace CoalaWeb; defined('_JEXEC') or die; /** * Class RegEx * @package CoalaWeb */ class RegEx { /** * Perform a regular expression search and replace * * @param string $pattern * @param string $replacement * @param string $string * @param string $options * @param int $limit * @param int $count * * @return string */ public static function replace($pattern, $replacement, $string, $options = null, $limit = -1, &$count = null) { if ( ! is_string($pattern) || $pattern == '' || ! is_string($string) || $string == '') { return $string; } $pattern = self::preparePattern($pattern, $options, $string); return preg_replace($pattern, $replacement, $string, $limit, $count); } /** * Perform a regular expression search and replace once * * @param string $pattern * @param string $replacement * @param string $string * @param string $options * * @return string */ public static function replaceOnce($pattern, $replacement, $string, $options = null) { return self::replace($pattern, $replacement, $string, $options, 1); } /** * Perform a regular expression match * * @param string $pattern * @param string $string * @param null $matches * @param string $options * @param int $flags * * @return int */ public static function match($pattern, $string, &$matches = null, $options = null, $flags = 0) { if ( ! is_string($pattern) || $pattern == '' || ! is_string($string) || $string == '') { return false; } $pattern = self::preparePattern($pattern, $options, $string); return preg_match($pattern, $string, $matches, $flags); } /** * Perform a global regular expression match * * @param string $pattern * @param string $string * @param null $matches * @param string $options * @param int $flags * * @return int */ public static function matchAll($pattern, $string, &$matches = null, $options = null, $flags = PREG_SET_ORDER) { if ( ! is_string($pattern) || $pattern == '' || ! is_string($string) || $string == '') { $matches = []; return false; } $pattern = self::preparePattern($pattern, $options, $string); return preg_match_all($pattern, $string, $matches, $flags); } /** * preg_quote the given string or array of strings * * @param string|array $data * @param string $name * @param string $delimiter * * @return string */ public static function quote($data, $name = '', $delimiter = '#', $capture = true) { if (is_array($data)) { $array = self::quoteArray($data, $delimiter); $prefix = '?!'; if ($capture) { $prefix = $name ? '?<' . $name . '>' : ''; } return '(' . $prefix . implode('|', $array) . ')'; } if ( ! empty($name)) { return '(?<' . $name . '>' . preg_quote($data, $delimiter) . ')'; } return preg_quote($data, $delimiter); } /** * reverse preg_quote the given string * * @param string $string * @param string $delimiter * * @return string */ public static function unquote($string, $delimiter = '#') { return strtr($string, [ '\\' . $delimiter => $delimiter, '\\.' => '.', '\\\\' => '\\', '\\+' => '+', '\\*' => '*', '\\?' => '?', '\\[' => '[', '\\^' => '^', '\\]' => ']', '\\$' => '$', '\\(' => '(', '\\)' => ')', '\\{' => '{', '\\}' => '}', '\\=' => '=', '\\!' => '!', '\\<' => '<', '\\>' => '>', '\\|' => '|', '\\:' => ':', '\\-' => '-', ]); } /** * preg_quote the given array of strings * * @param array $array * @param string $delimiter * * @return array */ public static function quoteArray($array = [], $delimiter = '#') { array_walk($array, function (&$part, $key, $delimiter) { $part = self::quote($part, '', $delimiter); }, $delimiter); return $array; } /** * Make a string a valid regular expression pattern * * @param string $pattern * @param string $options * @param string $string * * @return string */ public static function preparePattern($pattern, $options = null, $string = '') { if (is_array($pattern)) { return self::preparePatternArray($pattern, $options, $string); } if (substr($pattern, 0, 1) != '#') { $pattern = '#' . $pattern . '#'; } $options = ! is_null($options) ? $options : 'si'; if (substr($pattern, -1, 1) == '#') { $pattern .= $options; } if (StringHelper::detectUTF8($string)) { // use utf-8 return $pattern . 'u'; } return $pattern; } /** * Make an array of strings valid regular expression patterns * * @param array $pattern * @param string $options * @param string $string * * @return array */ private static function preparePatternArray($pattern, $options = null, $string = '') { array_walk($pattern, function (&$subpattern, $key, $string) { $subpattern = self::preparePattern($subpattern, $options = null, $string); }, $string); return $pattern; } }