preg_match('/te**ed/i', 'tested', $matches);
我遇到了以下错误:
错误:偏移量为3的位置没有可重复的内容
我该怎么做才能让模式实际包含 *
?
preg_match('/te**ed/i', 'tested', $matches);
我遇到了以下错误:
错误:偏移量为3的位置没有可重复的内容
我该怎么做才能让模式实际包含 *
?
要使用字面上的星号,您需要用反斜杠进行转义。要匹配字面上的te**ed
,您可以使用以下表达式:
preg_match('/te\*\*ed/i', 'tested', $matches); // no match (te**ed != tested)
但我怀疑这不是你想要的。如果你的意思是匹配任何字符,你需要使用.
:
preg_match('/te..ed/is', 'tested', $matches); // match
preg_match('/te[a-z]{2}ed/i', 'tested', $matches); // match
$matches
仍将为空,而preg_match('/te\*\*ed/i', 'te**ed', $matches)
将产生一个非空结果。 - Mark Elliotfunction match_string($pattern, $str)
{
$pattern = preg_replace('/([^*])/e', 'preg_quote("$1", "/")', $pattern);
$pattern = str_replace('*', '.*', $pattern);
return (bool) preg_match('/^' . $pattern . '$/i', $str);
}
例子:
match_string("*world*","hello world") // returns true
match_string("world*","hello world") // returns false
match_string("*world","hello world") // returns true
match_string("world*","hello world") // returns false
match_string("*ello*w*","hello world") // returns true
match_string("*w*o*r*l*d*","hello world") // returns true
在 Viktor Kruglikov 的回答基础上,这是 PHP 7.3 实现此功能的方法:
private function match(string $pattern, string $target): bool
{
$pattern = preg_replace_callback('/([^*])/', function($m) {return preg_quote($m[0], '/');}, $pattern);
$pattern = str_replace('*', '.*', $pattern);
return (bool) preg_match('/^' . $pattern . '$/i', $target);
}
在任何字符之前加上反斜杠将告诉PHP该字符应被视为普通字符,而非特殊的正则表达式字符。所以:
preg_match('/te\\**ed/i', 'tested', $matches);
tested
吗? - alex