如何通过前缀或后缀检查PHP中的子串。
例如,我有一个名为$to_search
的搜索字符串,如下所示:
$to_search = "abcdef"
以下三种情况检查$ to_search中的子字符串是否为:
$cases = ["abc def", "def", "deff", ... Other values ...];
现在我必须使用substr()
函数检测前三个案例。
如何在PHP中检测"abc def", "def", "deff"
为"abcdef"
的子字符串。
答案 0 :(得分:2)
您可能会发现两个单词之间的Levenshtein distance有用 - 1
的值为abc def
。但是你的问题没有明确定义 - 匹配“相似”的字符串并不意味着具体。
编辑 - 如果您将删除成本设置为0,那么这非常接近您建议的问题模型。只需检查数组中所有内容的levenshtein距离是否小于1。
答案 1 :(得分:1)
这将查找$ case中的任何字符串是否为$ to_search的子字符串。
foreach($cases as $someString){
if(strpos($to_search, $someString) !== false){
// $someString is found inside $to_search
}
}
只有" def"但是因为其他字符串都没有与彼此有很大关系。
也不在一边;它是前缀和后缀而不是后缀。
答案 2 :(得分:0)
您可以使用array_filter
这样的功能:
$cases = ["cake", "cakes", "flowers", "chocolate", "chocolates"];
$to_search = "chocolatecake";
$search = strtolower($to_search);
$arr = array_filter($cases, function($val) use ($search) { return
strpos( $search,
str_replace(' ', '', preg_replace('/s$/', '', strtolower($val))) ) !== FALSE; });
print_r($arr);
<强>输出:强>
Array
(
[0] => cake
[1] => cakes
[3] => chocolate
[4] => chocolates
)
正如我在上面评论的那样,它可以打印除deff
之外的所有值,而不是搜索字符串abcdef
的一部分。
答案 3 :(得分:0)
要查找以搜索字符串的开头或结尾开头或结尾的任何案例,我不知道另一种方法,而不是只是逐步完成所有可能的开头和结束组合并检查它们。可能有更好的方法,但这应该做到。
$to_search = "abcdef";
$cases = ["abc def", "def", "deff", "otherabc", "noabcmatch", "nodefmatch"];
$matches = array();
$len = strlen($to_search);
for ($i=1; $i <= $len; $i++) {
// get the beginning and end of the search string of length $i
$pre_post = array();
$pre_post[] = substr($to_search, 0, $i);
$pre_post[] = substr($to_search, -$i);
foreach ($cases as $case) {
// get the beginning and end of each case of length $i
$pre = substr($case, 0, $i);
$post = substr($case, -$i);
// check if any of them match
if (in_array($pre, $pre_post) || in_array($post, $pre_post)) {
// using the case as the array key for $matches will keep it distinct
$matches[$case] = true;
}
}
}
// use array_keys() to get the keys back to values
var_dump(array_keys($matches));