字符串匹配的Boyer-Moore算法 for PHP

/**  
 * @author jiangkejun  
 * @name Bm (Boyer-Moore算法) for PHP5  
 * @version 1.1.11 beta  
 * @since 2013.5.9 
 * @link http://developer.51cto.com/art/201305/392552.htm 
 * @uses 文本文档里的Ctrl+F 
 * @see 没有进行数组多项匹配,所以写的beta,学习用 
 * 
 * @param string $haystack 
 * @param mixed  $needle 
 */  
function Boyer_Moore( $haystack, $needle ){  
    $len = strlen( $needle );  
    // 起始句柄  
    $i = strlen( $needle ) - 1;  
    // 坏字符点  
    $bad = 0;  
    $tmp = '';  
    // 好后缀点  
    $good = 0;  
      
    while( $i < strlen( $haystack ) ){  
        // 最后字优先匹配原则  
        if( $haystack{$i} == $needle{$len-1} ){  
            $tmp = $haystack{$i} . $tmp;  
            // 好后缀计算 (后移位数 = 好后缀的位置 - 搜索词中的上一次出现位置)
            for ( $v = 1; $v < $len; $v++){  
                if( $needle{$len-1-$v} == $haystack{$i-$v} ){  
                    $tmp = $haystack{$i-$v} . $tmp;  
                }  
                else{  
                    $tlen = strlen( $tmp );  
                    if( $tlen == 1 ){  
                        $good = $bad = $len;
                    }  
                    else{ 
                        if( $index2 = strpos( substr( $tmp, 0, $tlen-1 ), $haystack{$i} ) ){  
                            $good = ( $len-1 ) - $index2;
                            $bad  = ( $len-1-$tlen ) - $index2;  
                        }  
                        else{  
                            $good = ( $len-1 ) - ( -1 );
                            $bad  = ( $len-1-$tlen ) - ( -1 );
                        }  
                    }  
                    $tmp = '';
                }  
            }  
            /* result is here */  
            if( $tmp ) { echo "Found between ".( $i-$len+1 )." to $i "; break; }
            // 这样展现思路会更清晰点
            $i += max( $good, $bad );  
        }  
        else{  
        	// 坏字符计算  (后移位数 = 坏字符的位置 - 搜索词中的上一次出现位置)
            // 结尾不匹配但在字符串内  
            if( $index = strpos( $needle, $haystack{$i} ) ){  
                $bad = ( $len-1 ) - ( $index );  
            }  
            // 反之  
            else{  
                $bad = ( $len-1 ) - ( -1 );  
            }  
            $i += $bad;
        }  
    }  
}  
  
$a = "HERE IS A SIMPLE EXAMPLE";  
$b = "EXAMPLE";  
Boyer_Moore($a, $b);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值