我想通过正则表达式解决以下问题
如果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"));
答案 0 :(得分:3)
这里不需要正则表达式,它只会使事情变得复杂。
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
的效果(例如单词goldenrod
:goldenr
将是生成的数组。)
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)