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

Php搜索字符串(带通配符),php,wildcard,Php,Wildcard,有没有办法在字符串中放入通配符?我之所以问这个问题,是因为目前我有一个函数可以在两个子字符串之间搜索子字符串(即抓取句子“我的狗有跳蚤”中“我的”和“有跳蚤”之间的内容,结果是“狗”) 我要做的是让它在字符串中使用通配符进行搜索。所以,假设我在句子“我的狗有跳蚤”中的“%WILDCARD%”和“has flipes”之间搜索,它仍然会输出“dog” 我不知道我是否解释得太好,但希望有人能理解我:p。非常感谢你的阅读 使用正则表达式 $string = "My dog has fleas"; if

有没有办法在字符串中放入通配符?我之所以问这个问题,是因为目前我有一个函数可以在两个子字符串之间搜索子字符串(即抓取句子“我的狗有跳蚤”中“我的”和“有跳蚤”之间的内容,结果是“狗”)

我要做的是让它在字符串中使用通配符进行搜索。所以,假设我在句子“我的狗有跳蚤”中的“%WILDCARD%”和“has flipes”之间搜索,它仍然会输出“dog”

我不知道我是否解释得太好,但希望有人能理解我:p。非常感谢你的阅读

使用正则表达式

$string = "My dog has fleas";
if (preg_match("/\S+ (\S+) has fleas/", $string, $matches))
  echo ($matches[1]);
else
  echo ("Not found");

\S
表示任何非空格字符,
+
表示前面的一个或多个字符,因此
\S+
表示匹配一个或多个非空格字符
(…)
表示捕获子匹配的内容并将其放入
$matches
数组。

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


请参阅文档。

如果坚持使用通配符(是的,PREG更好),则可以使用该函数

例:

if(fnmatch('my*has',$str)){

我同意正则表达式比通配符灵活得多,但有时您所需要的只是一种定义模式的简单方法。对于寻找便携式解决方案(不仅仅是*NIX)的人,以下是我的功能实现:

function wild_compare($wild, $string) {
    $wild_i = 0;
    $string_i = 0;

    $wild_len = strlen($wild);
    $string_len = strlen($string);

    while ($string_i < $string_len && $wild[$wild_i] != '*') {
        if (($wild[$wild_i] != $string[$string_i]) && ($wild[$wild_i] != '?')) {
            return 0;
        }
        $wild_i++;
        $string_i++;
    }

    $mp = 0;
    $cp = 0;

    while ($string_i < $string_len) {
        if ($wild[$wild_i] == '*') {
            if (++$wild_i == $wild_len) {
                return 1;
            }
            $mp = $wild_i;
            $cp = $string_i + 1;
        }
        else
        if (($wild[$wild_i] == $string[$string_i]) || ($wild[$wild_i] == '?')) {
            $wild_i++;
            $string_i++;
        }
        else {
            $wild_i = $mp;
            $string_i = $cp++;
        }
    }

    while ($wild[$wild_i] == '*') {
        $wild_i++;
    }

    return $wild_i == $wild_len ? 1 : 0;
}

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

function wildcard_match($pattern, $subject) {
  $pattern = strtr($pattern, array(
    '*' => '.*?', // 0 or more (lazy) - asterisk (*)
    '?' => '.', // 1 character - question mark (?)
  ));
  return preg_match("/$pattern/", $subject);
}
如果字符串内容包含特殊字符,例如\.+*?^$|{}/'\\,则应将其转义

不要测试:

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);
}

如果你想要通配符,你可以用正则表达式代替。非常感谢大家,真的!这是无知的,正则表达式是很好的工具。@ravelen:正则表达式是傻瓜手中可怕的工具。许多人在不了解它们的局限性、存在什么样的引擎等的情况下使用它们。正则表达式是傻瓜手中可怕的工具。我不知道还有哪种(程序员)工具经常被误用。@LukášLalinský你能怪我们吗?正则表达式的语法非常难看。几乎没有一次我在使用reg-ex时不通过谷歌搜索它!我们有一个要求,允许我们的员工输入正则表达式规则来匹配某些数据。因为他们不理解正则表达式,这是一个完美的解决方案!$pattern附近可能有preg_quote。目前,除了Windows之外,此功能在非POSIX兼容系统上不可用。所以它现在可以在Windows上运行了。@Moradnejad没错,我会编辑我的消息,这样它可能会帮助其他人!哈哈,我没想到你10岁的回答会这么快。
if (wild_compare('regex are * useful', 'regex are always useful') == 1) {
    echo "I'm glad we agree on this";
}
function wildcard_match($pattern, $subject) {
  $pattern = strtr($pattern, array(
    '*' => '.*?', // 0 or more (lazy) - asterisk (*)
    '?' => '.', // 1 character - question mark (?)
  ));
  return preg_match("/$pattern/", $subject);
}
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);
}