检查字母和/或整个单词是否包含在给定字符串中的函数

时间:2017-12-06 20:03:08

标签: php regex

我想通过正则表达式解决以下问题

  1. 所有5个字母'' o',' l',' d',' e' ' N'包括在内(任何一个 序列)和
  2. 字符串' golden'是给定字符串的子字符串。
  3. 如果1成立(但2不成立),则返回1.
    如果1和2都保持,则返回2。 否则返回0。

    这是我的代码。

    function checkstrling($input, $substring) 
    {
        $voodoo = preg_match("(".implode("(.*?)",array_map('preg_quote',str_split($substring))).")",$input,$matches);
        if( !$voodoo) return 0; // no match
        $pieces = implode("",array_slice($matches,1)); // in-between bits
        if( $pieces !=="") return 1; // there was stuff in between
        return 2; // substring found without interruption
    }
    
    var_dump(checkstrling("xgolensssx","golden"));
    var_dump(checkstrling("abcgxyommlgdqqesn","golden"));
    var_dump(checkstrling("xgoldensssx","golden"));
    

    当我调用函数work并提供以下参数时,它工作正常。

    var_dump(checkstrling("xgolensssx","golden"));
    var_dump(checkstrling("abcgxyommlgdqqesn","golden"));
    var_dump(checkstrling("xgoldensssx","golden"));
    

    但是当我使用以下参数再次调用该函数时,它无法正常工作。

    var_dump(checkstrling("somegxoxdxlxnmme","golden"));
    var_dump(checkstrling("somegxoxlxdxemnmgoldenv","golden"));
    

2 个答案:

答案 0 :(得分:3)

这里不需要正则表达式,它只会使事情变得复杂。

代码

See code in use here

function checkstrling($input, $substring) 
{
    if (strpos($input, $substring) !== false) {
       return 2;
    }
    foreach (str_split($substring) as $char) {
        if (strpos($input, $char) === false) {
            return 0;
        }
    }
    return 1;
}

print checkstrling("xgolensssx","golden");              // 0
print checkstrling("abcgxyommlgdqqesn","golden");       // 1
print checkstrling("xgoldensssx","golden");             // 2

print checkstrling("somegxoxdxlxnmme","golden");        // 1
print checkstrling("somegxoxlxdxemnmgoldenv","golden"); // 2

旁注:您可以在执行循环之前将str_split($substring)更改为array_unique(str_split($substring))以删除重复项。这可以提高包含重复字母的较大$substring的效果(例如单词goldenrodgoldenr将是生成的数组。)

说明

  • 如果字符串中存在单词,则返回2,否则,请继续
  • 循环遍历$substring中的每个字符
    • 如果找不到该字符,请返回0
  • 只有在循环成功完成后才能达到此点,返回1

答案 1 :(得分:0)

您可以使用多个前瞻:

(?=[^g]*g)
(?=[^o]*o)
(?=[^l]*l)
(?=[^d]*d)
(?=[^e]*e)
(?=[^n]*n)

模式始终相同:寻找任何 g零次或多次,而不是寻找g

<小时/> 在PHP

<?php

function checkstrling($input, $substring) {
    $regex = '~(?=[^g]*g)(?=[^o]*o)(?=[^l]*l)(?=[^d]*d)(?=[^e]*e)(?=[^n]*n).+~';

    if ((preg_match($regex, $input) && (strpos($input, $substring) !== false))) {
        return 2;
    } else if (preg_match($regex, $input)) {
        return 1;
    }
    return 0;
}

var_dump(checkstrling("xgolensssx","golden"));
var_dump(checkstrling("abcgxyommlgdqqesn","golden"));
var_dump(checkstrling("xgoldensssx","golden"));
var_dump(checkstrling("somegxoxdxlxnmme","golden"));
var_dump(checkstrling("somegxoxlxdxemnmgoldenv","golden"));
?>

哪个收益

int(0)
int(1)
int(2)
int(1)
int(2)