660 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			660 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Safe;
 | 
						|
 | 
						|
use Safe\Exceptions\PcreException;
 | 
						|
 | 
						|
/**
 | 
						|
 * Searches subject for all matches to the regular
 | 
						|
 * expression given in pattern and puts them in
 | 
						|
 * matches in the order specified by
 | 
						|
 * flags.
 | 
						|
 *
 | 
						|
 * After the first match is found, the subsequent searches  are continued
 | 
						|
 * on from end of the last match.
 | 
						|
 *
 | 
						|
 * @param string $pattern The pattern to search for, as a string.
 | 
						|
 * @param string $subject The input string.
 | 
						|
 * @param array $matches Array of all matches in multi-dimensional array ordered according to
 | 
						|
 * flags.
 | 
						|
 * @param int $flags Can be a combination of the following flags (note that it doesn't make
 | 
						|
 * sense to use PREG_PATTERN_ORDER together with
 | 
						|
 * PREG_SET_ORDER):
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_PATTERN_ORDER
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * Orders results so that $matches[0] is an array of full
 | 
						|
 * pattern matches, $matches[1] is an array of strings matched by
 | 
						|
 * the first parenthesized subpattern, and so on.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * example: , this is a test
 | 
						|
 * example: , this is a test
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * So, $out[0] contains array of strings that matched full pattern,
 | 
						|
 * and $out[1] contains array of strings enclosed by tags.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If the pattern contains named subpatterns, $matches
 | 
						|
 * additionally contains entries for keys with the subpattern name.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If the pattern contains duplicate named subpatterns, only the rightmost
 | 
						|
 * subpattern is stored in $matches[NAME].
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * [1] => bar
 | 
						|
 * )
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_SET_ORDER
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * Orders results so that $matches[0] is an array of first set
 | 
						|
 * of matches, $matches[1] is an array of second set of matches,
 | 
						|
 * and so on.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * example: , example:
 | 
						|
 * this is a test, this is a test
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_OFFSET_CAPTURE
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is passed, for every occurring match the appendant string
 | 
						|
 * offset (in bytes) will also be returned. Note that this changes the value of
 | 
						|
 * matches into an array of arrays where every element is an
 | 
						|
 * array consisting of the matched string at offset 0
 | 
						|
 * and its string offset into subject at offset
 | 
						|
 * 1.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * Array
 | 
						|
 * (
 | 
						|
 * [0] => Array
 | 
						|
 * (
 | 
						|
 * [0] => foobarbaz
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [1] => Array
 | 
						|
 * (
 | 
						|
 * [0] => Array
 | 
						|
 * (
 | 
						|
 * [0] => foo
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [2] => Array
 | 
						|
 * (
 | 
						|
 * [0] => Array
 | 
						|
 * (
 | 
						|
 * [0] => bar
 | 
						|
 * [1] => 3
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [3] => Array
 | 
						|
 * (
 | 
						|
 * [0] => Array
 | 
						|
 * (
 | 
						|
 * [0] => baz
 | 
						|
 * [1] => 6
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_UNMATCHED_AS_NULL
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is passed, unmatched subpatterns are reported as NULL;
 | 
						|
 * otherwise they are reported as an empty string.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * Orders results so that $matches[0] is an array of full
 | 
						|
 * pattern matches, $matches[1] is an array of strings matched by
 | 
						|
 * the first parenthesized subpattern, and so on.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * example: , this is a test
 | 
						|
 * example: , this is a test
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * So, $out[0] contains array of strings that matched full pattern,
 | 
						|
 * and $out[1] contains array of strings enclosed by tags.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * So, $out[0] contains array of strings that matched full pattern,
 | 
						|
 * and $out[1] contains array of strings enclosed by tags.
 | 
						|
 *
 | 
						|
 * If the pattern contains named subpatterns, $matches
 | 
						|
 * additionally contains entries for keys with the subpattern name.
 | 
						|
 *
 | 
						|
 * If the pattern contains duplicate named subpatterns, only the rightmost
 | 
						|
 * subpattern is stored in $matches[NAME].
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * [1] => bar
 | 
						|
 * )
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * Orders results so that $matches[0] is an array of first set
 | 
						|
 * of matches, $matches[1] is an array of second set of matches,
 | 
						|
 * and so on.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * example: , example:
 | 
						|
 * this is a test, this is a test
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * If this flag is passed, for every occurring match the appendant string
 | 
						|
 * offset (in bytes) will also be returned. Note that this changes the value of
 | 
						|
 * matches into an array of arrays where every element is an
 | 
						|
 * array consisting of the matched string at offset 0
 | 
						|
 * and its string offset into subject at offset
 | 
						|
 * 1.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * Array
 | 
						|
 * (
 | 
						|
 * [0] => Array
 | 
						|
 * (
 | 
						|
 * [0] => foobarbaz
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [1] => Array
 | 
						|
 * (
 | 
						|
 * [0] => Array
 | 
						|
 * (
 | 
						|
 * [0] => foo
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [2] => Array
 | 
						|
 * (
 | 
						|
 * [0] => Array
 | 
						|
 * (
 | 
						|
 * [0] => bar
 | 
						|
 * [1] => 3
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [3] => Array
 | 
						|
 * (
 | 
						|
 * [0] => Array
 | 
						|
 * (
 | 
						|
 * [0] => baz
 | 
						|
 * [1] => 6
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * If this flag is passed, unmatched subpatterns are reported as NULL;
 | 
						|
 * otherwise they are reported as an empty string.
 | 
						|
 *
 | 
						|
 * If no order flag is given, PREG_PATTERN_ORDER is
 | 
						|
 * assumed.
 | 
						|
 * @param int $offset Orders results so that $matches[0] is an array of full
 | 
						|
 * pattern matches, $matches[1] is an array of strings matched by
 | 
						|
 * the first parenthesized subpattern, and so on.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * example: , this is a test
 | 
						|
 * example: , this is a test
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * So, $out[0] contains array of strings that matched full pattern,
 | 
						|
 * and $out[1] contains array of strings enclosed by tags.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * So, $out[0] contains array of strings that matched full pattern,
 | 
						|
 * and $out[1] contains array of strings enclosed by tags.
 | 
						|
 *
 | 
						|
 * If the pattern contains named subpatterns, $matches
 | 
						|
 * additionally contains entries for keys with the subpattern name.
 | 
						|
 *
 | 
						|
 * If the pattern contains duplicate named subpatterns, only the rightmost
 | 
						|
 * subpattern is stored in $matches[NAME].
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * [1] => bar
 | 
						|
 * )
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 * @return int Returns the number of full pattern matches (which might be zero).
 | 
						|
 * @throws PcreException
 | 
						|
 *
 | 
						|
 */
 | 
						|
function preg_match_all(string $pattern, string $subject, array &$matches = null, int $flags = PREG_PATTERN_ORDER, int $offset = 0): int
 | 
						|
{
 | 
						|
    error_clear_last();
 | 
						|
    $result = \preg_match_all($pattern, $subject, $matches, $flags, $offset);
 | 
						|
    if ($result === false) {
 | 
						|
        throw PcreException::createFromPhpError();
 | 
						|
    }
 | 
						|
    return $result;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Searches subject for a match to the regular
 | 
						|
 * expression given in pattern.
 | 
						|
 *
 | 
						|
 * @param string $pattern The pattern to search for, as a string.
 | 
						|
 * @param string $subject The input string.
 | 
						|
 * @param array $matches If matches is provided, then it is filled with
 | 
						|
 * the results of search. $matches[0] will contain the
 | 
						|
 * text that matched the full pattern, $matches[1]
 | 
						|
 * will have the text that matched the first captured parenthesized
 | 
						|
 * subpattern, and so on.
 | 
						|
 * @param int $flags flags can be a combination of the following flags:
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_OFFSET_CAPTURE
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is passed, for every occurring match the appendant string
 | 
						|
 * offset (in bytes) will also be returned. Note that this changes the value of
 | 
						|
 * matches into an array where every element is an
 | 
						|
 * array consisting of the matched string at offset 0
 | 
						|
 * and its string offset into subject at offset
 | 
						|
 * 1.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * Array
 | 
						|
 * (
 | 
						|
 * [0] => foobarbaz
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [1] => Array
 | 
						|
 * (
 | 
						|
 * [0] => foo
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [2] => Array
 | 
						|
 * (
 | 
						|
 * [0] => bar
 | 
						|
 * [1] => 3
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [3] => Array
 | 
						|
 * (
 | 
						|
 * [0] => baz
 | 
						|
 * [1] => 6
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_UNMATCHED_AS_NULL
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is passed, unmatched subpatterns are reported as NULL;
 | 
						|
 * otherwise they are reported as an empty string.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * string(2) "ac"
 | 
						|
 * [1]=>
 | 
						|
 * string(1) "a"
 | 
						|
 * [2]=>
 | 
						|
 * string(0) ""
 | 
						|
 * [3]=>
 | 
						|
 * string(1) "c"
 | 
						|
 * }
 | 
						|
 * array(4) {
 | 
						|
 * [0]=>
 | 
						|
 * string(2) "ac"
 | 
						|
 * [1]=>
 | 
						|
 * string(1) "a"
 | 
						|
 * [2]=>
 | 
						|
 * NULL
 | 
						|
 * [3]=>
 | 
						|
 * string(1) "c"
 | 
						|
 * }
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is passed, for every occurring match the appendant string
 | 
						|
 * offset (in bytes) will also be returned. Note that this changes the value of
 | 
						|
 * matches into an array where every element is an
 | 
						|
 * array consisting of the matched string at offset 0
 | 
						|
 * and its string offset into subject at offset
 | 
						|
 * 1.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * Array
 | 
						|
 * (
 | 
						|
 * [0] => foobarbaz
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [1] => Array
 | 
						|
 * (
 | 
						|
 * [0] => foo
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [2] => Array
 | 
						|
 * (
 | 
						|
 * [0] => bar
 | 
						|
 * [1] => 3
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [3] => Array
 | 
						|
 * (
 | 
						|
 * [0] => baz
 | 
						|
 * [1] => 6
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * If this flag is passed, unmatched subpatterns are reported as NULL;
 | 
						|
 * otherwise they are reported as an empty string.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * string(2) "ac"
 | 
						|
 * [1]=>
 | 
						|
 * string(1) "a"
 | 
						|
 * [2]=>
 | 
						|
 * string(0) ""
 | 
						|
 * [3]=>
 | 
						|
 * string(1) "c"
 | 
						|
 * }
 | 
						|
 * array(4) {
 | 
						|
 * [0]=>
 | 
						|
 * string(2) "ac"
 | 
						|
 * [1]=>
 | 
						|
 * string(1) "a"
 | 
						|
 * [2]=>
 | 
						|
 * NULL
 | 
						|
 * [3]=>
 | 
						|
 * string(1) "c"
 | 
						|
 * }
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 * @param int $offset If this flag is passed, for every occurring match the appendant string
 | 
						|
 * offset (in bytes) will also be returned. Note that this changes the value of
 | 
						|
 * matches into an array where every element is an
 | 
						|
 * array consisting of the matched string at offset 0
 | 
						|
 * and its string offset into subject at offset
 | 
						|
 * 1.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 *
 | 
						|
 * Array
 | 
						|
 * (
 | 
						|
 * [0] => foobarbaz
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [1] => Array
 | 
						|
 * (
 | 
						|
 * [0] => foo
 | 
						|
 * [1] => 0
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [2] => Array
 | 
						|
 * (
 | 
						|
 * [0] => bar
 | 
						|
 * [1] => 3
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * [3] => Array
 | 
						|
 * (
 | 
						|
 * [0] => baz
 | 
						|
 * [1] => 6
 | 
						|
 * )
 | 
						|
 *
 | 
						|
 * )
 | 
						|
 * ]]>
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The above example will output:
 | 
						|
 * @return int preg_match returns 1 if the pattern
 | 
						|
 * matches given subject, 0 if it does not.
 | 
						|
 * @throws PcreException
 | 
						|
 *
 | 
						|
 */
 | 
						|
function preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int
 | 
						|
{
 | 
						|
    error_clear_last();
 | 
						|
    $result = \preg_match($pattern, $subject, $matches, $flags, $offset);
 | 
						|
    if ($result === false) {
 | 
						|
        throw PcreException::createFromPhpError();
 | 
						|
    }
 | 
						|
    return $result;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Split the given string by a regular expression.
 | 
						|
 *
 | 
						|
 * @param string $pattern The pattern to search for, as a string.
 | 
						|
 * @param string $subject The input string.
 | 
						|
 * @param int|null $limit If specified, then only substrings up to limit
 | 
						|
 * are returned with the rest of the string being placed in the last
 | 
						|
 * substring.  A limit of -1 or 0 means "no limit".
 | 
						|
 * @param int $flags flags can be any combination of the following
 | 
						|
 * flags (combined with the | bitwise operator):
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_SPLIT_NO_EMPTY
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is set, only non-empty pieces will be returned by
 | 
						|
 * preg_split.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_SPLIT_DELIM_CAPTURE
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is set, parenthesized expression in the delimiter pattern
 | 
						|
 * will be captured and returned as well.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * PREG_SPLIT_OFFSET_CAPTURE
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is set, for every occurring match the appendant string
 | 
						|
 * offset will also be returned. Note that this changes the return
 | 
						|
 * value in an array where every element is an array consisting of the
 | 
						|
 * matched string at offset 0 and its string offset
 | 
						|
 * into subject at offset 1.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * If this flag is set, for every occurring match the appendant string
 | 
						|
 * offset will also be returned. Note that this changes the return
 | 
						|
 * value in an array where every element is an array consisting of the
 | 
						|
 * matched string at offset 0 and its string offset
 | 
						|
 * into subject at offset 1.
 | 
						|
 * @return array Returns an array containing substrings of subject
 | 
						|
 * split along boundaries matched by pattern.
 | 
						|
 * @throws PcreException
 | 
						|
 *
 | 
						|
 */
 | 
						|
function preg_split(string $pattern, string $subject, ?int $limit = -1, int $flags = 0): array
 | 
						|
{
 | 
						|
    error_clear_last();
 | 
						|
    $result = \preg_split($pattern, $subject, $limit, $flags);
 | 
						|
    if ($result === false) {
 | 
						|
        throw PcreException::createFromPhpError();
 | 
						|
    }
 | 
						|
    return $result;
 | 
						|
}
 |