其他字符串PHP

时间:2015-07-22 15:25:45

标签: php regex string substring strpos

如何通过前缀或后缀检查PHP中的子串。 例如,我有一个名为$to_search的搜索字符串,如下所示:

$to_search = "abcdef"

以下三种情况检查$ to_search中的子字符串是否为:

$cases = ["abc def", "def", "deff", ... Other values ...];

现在我必须使用substr()函数检测前三个案例。 如何在PHP中检测"abc def", "def", "deff""abcdef"的子字符串。

4 个答案:

答案 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));