【问题标题】:similar substring in other string PHP其他字符串 PHP 中的类似子字符串
【发布时间】:2015-07-22 15:25:45
【问题描述】:

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

$to_search = "abcdef"

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

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

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

【问题讨论】:

  • 我不确定我是否理解。您想找出 $cases 数组的哪些元素是 $to_search 的子字符串?
  • @jedrzej.kurylo 我想搜索前三个作为 $to_search 的子字符串
  • $cases 中的前三个元素是 $to_search 的子字符串,对吗?
  • deff 如何是abcdef 的子字符串?
  • 它不是确切的子字符串,但我想要因为 def 是 abcdef 的后缀

标签: php regex string substring strpos


【解决方案1】:

您可能会发现这两个词之间的Levenshtein distance 很有用 - 对于abc def,它将具有1 的值。但是,您的问题没有明确定义 - 匹配“相似”的字符串并不意味着具体。

编辑 - 如果您将删除成本设置为 0,那么这非常接近您提出的问题的模型。只需检查数组中所有内容的 levenshtein 距离是否小于 1。

【讨论】:

  • @developer 我认为这就是你想要的。文本相似性而非子串的度量。子字符串是精确的。这是一个启发式的相似性比较。
【解决方案2】:

这将查找 $cases 中的任何字符串是否是 $to_search 的子字符串。

foreach($cases as $someString){
    if(strpos($to_search, $someString) !== false){
        // $someString is found inside $to_search
    }
}

只有“def”是因为其他字符串之间没有太大关系。

也不是;它是前缀和后缀而不是后缀。

【讨论】:

  • 是的,但我也想检测其余的情况。只有“def”我之前尝试过,但我想要其余的情况以及子字符串。
  • 恐怕我不明白你的意思。此循环将查找作为搜索词子字符串的任何词。您给出的示例不是您给出的搜索词的子字符串。
  • 是的,你是对的,它们不是子字符串,但它们具有后缀或前缀或类似单词形式的子字符串。我想检查一下。
【解决方案3】:

要查找以搜索字符串的开头或结尾开头或结尾的任何情况,我不知道有另一种方法可以做到这一点,而不是单步执行所有可能的开头和结尾组合并检查它们。可能有更好的方法来做到这一点,但应该这样做。

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

【讨论】:

    【解决方案4】:

    你可以像这样使用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 的一部分。

    【讨论】:

    • 你说的差不多了,但是如何检测 abcdef 的部分为 def 呢?
    • 是否有任何可能的也打印deff?只是把最后一个词作为 aspumtion 吗?
    • deffabcdef 我们有一个共同的def
    • 这对代码来说逻辑不够好,那么它应该找到destiny,因为de很常见。
    • 我想找到带“s”和不带“s”的单词作为英文单词的真实例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多