mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-07-23 00:25:35 +08:00
refactor match_pattern implementation (#102)
* refactor match_pattern implementation * add match_pattern escaped wildcards support * add match_pattern global function test
This commit is contained in:
@@ -99,19 +99,9 @@ function unicode_decode(string $str): ?string
|
|||||||
*/
|
*/
|
||||||
function match_pattern(string $pattern, string $subject): bool
|
function match_pattern(string $pattern, string $subject): bool
|
||||||
{
|
{
|
||||||
if (empty($pattern) && empty($subject)) {
|
$pattern = str_replace(['\*', '\\\\.*'], ['.*', '\*'], preg_quote($pattern, '/'));
|
||||||
return true;
|
$pattern = '/^' . $pattern . '$/i';
|
||||||
}
|
return preg_match($pattern, $subject) === 1;
|
||||||
if (mb_strpos($pattern, '*') === 0 && mb_substr($pattern, 1, 1) !== '' && empty($subject)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (mb_strpos($pattern, mb_substr($subject, 0, 1)) === 0) {
|
|
||||||
return match_pattern(mb_substr($pattern, 1), mb_substr($subject, 1));
|
|
||||||
}
|
|
||||||
if (mb_strpos($pattern, '*') === 0) {
|
|
||||||
return match_pattern(mb_substr($pattern, 1), $subject) || match_pattern($pattern, mb_substr($subject, 1));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -40,4 +40,35 @@ class GlobalFunctionsTest extends TestCase
|
|||||||
});
|
});
|
||||||
$this->assertLessThan(0.1, $time);
|
$this->assertLessThan(0.1, $time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerTestMatchPattern
|
||||||
|
*/
|
||||||
|
public function testMatchPattern(string $pattern, string $subject, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals($expected, match_pattern($pattern, $subject));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerTestMatchPattern(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'empty' => ['', '', true],
|
||||||
|
'empty subject' => ['foo', '', false],
|
||||||
|
'empty pattern' => ['', 'foo', false],
|
||||||
|
'simple' => ['foo', 'foo', true],
|
||||||
|
'simple case insensitive' => ['FOO', 'foo', true],
|
||||||
|
'simple case insensitive 2' => ['foo', 'FOO', true],
|
||||||
|
'unicode' => ['föö', 'föö', true],
|
||||||
|
'chinese' => ['中文', '中文', true],
|
||||||
|
'wildcard' => ['foo*', 'foo', true],
|
||||||
|
'wildcard 2' => ['foo*', 'foobar', true],
|
||||||
|
'wildcard 3' => ['foo*bar', 'foo with bar', true],
|
||||||
|
'wildcard 4' => ['foo*bar', 'foo but no bar with it', false],
|
||||||
|
'wildcard with chinese' => ['中文*', '中文', true],
|
||||||
|
'wildcard with chinese 2' => ['全世界*中国话', '全世界都在说中国话', true],
|
||||||
|
'complex' => ['foo*bar*baz', 'foo with bar and baz', true],
|
||||||
|
'regex' => ['[a-z]+', 'foo', false], // regex is not supported yet
|
||||||
|
'escaped' => ['foo\\*bar', 'foo*bar', true],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user