Php搜索字符串(带通配符)

Bae*_*ehr 7 php wildcard

有没有办法在字符串中放一个通配符?我问的原因是因为目前我有一个函数来搜索两个子串之间的子串(即在"我的狗有跳蚤"这句话中抓住"我的"和"有跳蚤"之间的内容,导致"狗" ).

function get_string_between($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 
Run Code Online (Sandbox Code Playgroud)

我想要做的是让它在字符串中使用通配符进行搜索.所以说我在"我的狗有跳蚤"这句话中搜索"%WILDCARD%"和"跳蚤" - 它仍会输出"狗".

我不知道我是否解释得太好但希望有人能理解我:P.非常感谢您的阅读!

Luk*_*ský 10

这是正则表达式实际上有用的少数情况之一.:)

if (preg_match('/my (\w+) has/', $str, $matches)) {
    echo $matches[1];
}
Run Code Online (Sandbox Code Playgroud)

请参阅preg_match的文档.

  • *正则表达式是傻瓜手中的糟糕工具.*所以其他所有工具都存在. (16认同)
  • 这只是无知,正则表达式是很好的工具. (10认同)
  • @LukášLalinský你能怪我们吗?正则表达式的语法非常难看.实际上没有一次我使用reg ex而不使用Google搜索 (4认同)

use*_*944 6

通配符模式可以像这样转换为正则表达式模式

function wildcard_match($pattern, $subject) {
  $pattern = strtr($pattern, array(
    '*' => '.*?', // 0 or more (lazy) - asterisk (*)
    '?' => '.', // 1 character - question mark (?)
  ));
  return preg_match("/$pattern/", $subject);
}
Run Code Online (Sandbox Code Playgroud)

如果字符串包含特殊字符,例如 \.+*?^$|{}/'#,它们应该被 \-escaped

不要测试:

function wildcard_match($pattern, $subject) {
  // quotemeta function has most similar behavior,
  // it escapes \.+*?^$[](), but doesn't escape |{}/'#
  // we don't include * and ?
  $special_chars = "\.+^$[]()|{}/'#";
  $special_chars = str_split($special_chars);
  $escape = array();
  foreach ($special_chars as $char) $escape[$char] = "\\$char";
  $pattern = strtr($pattern, $escape);
  $pattern = strtr($pattern, array(
    '*' => '.*?', // 0 or more (lazy) - asterisk (*)
    '?' => '.', // 1 character - question mark (?)
  ));
  return preg_match("/$pattern/", $subject);
}
Run Code Online (Sandbox Code Playgroud)