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