PHP-字符串模式匹配

PHP

(1)字符串模式匹配

代码

function isStr($str1, $str2)
{
    $str2_len = strlen($str2);
    $str1_len = strlen($str1);
    $isExist  = false;
    $num      = 0;

    for ($i = 0; $i < $str2_len; $i = (($p != 0) ? $p : $i + 1)) {
        $isExist = true;
        $offset  = $i;
        $p       = 0;

        //debug
        $num++;
        echo "第{$num}次=>offset->({$i})<br/>";

        for ($j = 0; $j < $str1_len; $j++) {
            if ($str1{$j} != $str2{$offset++}) {
                $isExist = false;
                break;
            }

            if ($p == 0 && $j > 0 && $str1{0} == $str2{$offset - 1}) {
                $p = $offset - 1;
            }
        }

        if ($isExist) {
            break;
        }
    }

    return $isExist;
}

测试

$str1 = 'ABCDABD';
$str2 = 'BBCABCDABABCDABCDABDE';
var_dump(isStr($str1, $str2));

结果

第1次匹配=>offset->(0)
第2次匹配=>offset->(1)
第3次匹配=>offset->(2)
第4次匹配=>offset->(3)
第5次匹配=>offset->(7)
第6次匹配=>offset->(8)
第7次匹配=>offset->(9)
第8次匹配=>offset->(13)
bool(true)

结束

可以看到打印的结果并没有每次回溯都是向后匹配偏移+1,而是每次偏移的位置会随着上次匹配的记录并标识出当前跳转的offset 而改变,这样省略了很多无用的比较,直到最后匹配成功或者失败。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容