ホームページ >バックエンド開発 >PHPチュートリアル >文字列の傍受に関するテンセントの質問に対するパロディ

文字列の傍受に関するテンセントの質問に対するパロディ

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-23 14:14:14931ブラウズ

トピックは次のとおりです。
「123907fae80ddef53131f3292ee4f81644babcd1c6776b927dc33c5d9114750b586338456907fae80ddef53131f3292ee4f81644bdefd1c6776b927dc33c5d9114750b586338789」のような文字列があるとします。文字列とインターセプトされる長さを渡すことができる関数を作成します。 。インターセプトした結果を返します。

要件:
1 907fae80ddef53131f3292ee4f81644b および d1c6776b927dc33c5d9114750b586338 タグは長さにカウントされません。
2 文字列をインターセプトした後、元の 907fae80ddef53131f3292ee4f81644b タグは保持される必要がありますが、最後のタグが閉じられていない場合、その開始タグは削除されます。

例:
質問の文字列について、長さ 5 をインターセプトしたい場合は、返される文字列は次のようになります: 123ab。長さ 8 をインターセプトしたい場合は、123907fae80ddef53131f3292ee4f81644babcc69278b6c6dfeddaef1009ea06904f13a4b561c25d9afb9ac8dc4d70affff419123df250b2156c434f3390392d09b1c9563907fae80ddef53131f3292ee4f81644babcd1c6776b927dc33c5d9114750b586338 45


6defg789

処理結果: 39f02edf8a59055245540440bbca095bdefg78

インターセプト長: 123abc456defg78 (15)

処理前: 0511ef35f46864c22a06c599220d1c6fa4b561c25d9afb9ac8dc4d70affff419123df250b2156c434f3390392d09b1c9563907fae80ddef53131f3292ee4f81644babccab1c1cf5db8346b2634121f493475d6
a34de1251f0d9fe1e645927f19a896e8
6bbfc6632178c117c9deab52fc18c61364cce7e16b7bec112365d6c711c72dd4b90dd5946f0946207856a8a37f441edf
b6c5a531a458a2e790c1fd6421739d1c39318b6f72ed39310530dfd69d0078e1364867的玉米小店46eb22d0a433f22cff9940d34d5612bf
                买家信用:dfdb09a6c9ce79eb483f8d636904c3920f9fb52a247fd442e9783728bad28eeac54bdf357c58b8a65c66d7c19c8e4d1145db79b134e9f6b82c0b36e0489ee08edff9d32c555bb1d9133a29eb4371c1213
                卖家好评率:100.00%ff9d32c555bb1d9133a29eb4371c1213
                买家好评率:0.00%ff9d32c555bb1d9133a29eb4371c1213
                注册时间:2010年04月29日ff9d32c555bb1d9133a29eb4371c1213
                c133762e0d7279d5af7a4a29161990dd荣誉资质:0f92b7548c91c7ef7d4bae11191a081116b28748ea4df4d9c2150843fecfba68
                dc6dce4a544fdca2df29d5ac0ea9906b04354b12485ca7673574260f27bacdfa4d16aaff278fa17605f718d464fe0a905db79b134e9f6b82c0b36e0489ee08ed16b28748ea4df4d9c2150843fecfba68b90dd5946f0946207856a8a37f441edf
fd273fcf5bcad3dfdad3c41bd81ad3e5
f16b1740fad44fb09bfe928bcc527e08

        
        b90dd5946f0946207856a8a37f441edf
      fd273fcf5bcad3dfdad3c41bd81ad3e5
      a34de1251f0d9fe1e645927f19a896e8
        414ab66612af9d79a457df943eb4d697 b90dd5946f0946207856a8a37f441edf
      fd273fcf5bcad3dfdad3c41bd81ad3e5
    f16b1740fad44fb09bfe928bcc527e08





处理结果:
        

6bbfc6632178c117c9deab52fc18c61364cce7e16b7bec112365d6c711c72dd4b90dd5946f0946207856a8a37f441edf
39318b6f72ed39310530dfd69d0078e1364867的玉米小店46eb22d0a433f22cff9940d34d5612bf
                买家信用:dfdb09a6c9ce79eb483f8d636904c3920f9fb52a247fd442e9783728bad28eeac54bdf357c58b8a65c66d7c19c8e4d1145db79b134e9f6b82c0b36e0489ee08edff9d32c555bb1d9133a29eb4371c1213
                卖家好评率:100.00%ff9d32c555bb1d9133a29eb4371c1213
                买家好评率:0.00%ff9d32c555bb1d9133a29eb4371c1213
                注册





截取长度:
        


364867的玉米小店
                买家信用:0
                卖家好评率:100.00%
                买家好评率:0.00%
                注册 (160)






未处理前:
        ff7eabeb708d7cf950310bb7592eae29
a34de1251f0d9fe1e645927f19a896e8
6bbfc6632178c117c9deab52fc18c61364cce7e16b7bec112365d6c711c72dd4b90dd5946f0946207856a8a37f441edf
b6c5a531a458a2e790c1fd6421739d1c39318b6f72ed39310530dfd69d0078e1364867的玉米小店46eb22d0a433f22cff9940d34d5612bf
                买家信用:dfdb09a6c9ce79eb483f8d636904c3920f9fb52a247fd442e9783728bad28eeac54bdf357c58b8a65c66d7c19c8e4d1145db79b134e9f6b82c0b36e0489ee08edff9d32c555bb1d9133a29eb4371c1213
                卖家好评率:100.00%ff9d32c555bb1d9133a29eb4371c1213
                买家好评率:0.00%ff9d32c555bb1d9133a29eb4371c1213
                注册


内存使用情况:5096

算法运行时间(microtime):0.0040628910064697

精简后的代码

<?php// QQ群:23930992function find($str, $size, &$string, &$number, &$saveString, &$newString) // 查找标签并保存到标签组{    $i=$j=0;    while(strlen($saveString)<$size)    {        if($str[$i] == '<')        {            $k=0;            $number[$j][$k++]=$i;            $string[$j]='';            do            {                $string[$j].=$str[$i];                $i++;            }while($str[$i] != '>');            $number[$j++][$k]=$i;        }        else        {            $saveString.=$str[$i];        }        $i++;    }    for($j=0; $j<$i; $j++)    {        $newString.=$str[$j];    }}function filter($str)  // 过滤标签,然后进行比较{    $newstr    = '';    $strLength = strlen($str);    for($i=0;$i<$strLength;$i++)    {        switch($str[$i])        {            case '<' : continue;            case '/' : continue;            case '>' : continue;            case ' ' : break 2;            default  : $newstr .= $str[$i];        }    }    return $newstr;}function deleteReservedTag(&$string, &$number, $reserved) // 从标签组里去除 保留标签{    $stringLength   = count($string);    $reservedLength = count($reserved);    for($i=0; $i<$stringLength;$i++)      // 去掉保留标签部分    {        for($j=0;$j < $reservedLength;$j++)        {            if( filter($string[$i]) == filter($reserved[$j]) )            {                $string[$i] = NULL;                for($k=0;$k<2;$k++)                {                    $number[$i][$k] = NULL;                }            }        }    }}function compare(&$string, &$number)     //比较成对标签{    $stringLength = count($string);    for($i=0; $i < $stringLength; $i++)  //删除成对标签    {        for($j = $i+1; $j < $stringLength; $j++)        {            if( filter($string[$i]) == filter($string[$j]) )            {                $string[$i] = $string[$j] = NULL;                for($k=0;$k<2;$k++)                {                    $number[$i][$k] = $number[$j][$k] = NULL;                }            }        }    }        //begin 把标签组空的地方 填补 (你可以去除本小段代码,代价是运行时间增加了)    $tempString[]    = '';    $tempNumber[][]  = 0;    for($i=0,$j=0; $i < $stringLength; $i++)    {        if($string[$i] != NULL)        {            $tempString[$j]=$string[$i];            for($k=0;$k<2;$k++)            {                 $tempNumber[$j][$k] = $number[$i][$k];            }            $j++;        }    }    $string = $tempString;    $number = $tempNumber;    //end}function replace(&$string, $number, $newString) // 核心代码 ...{    $tempString       = '';    $saveStringLength = strlen($newString);    $stringLength     = count($string);    for($i=0, $j=0; $i < $saveStringLength; $i++, $j=0)    {        while( $j < $stringLength )        {            if( $i == $number[$j][0])            {                $i = $number[$j][1];                $i++;            }            $j++;        }        $tempString .= $newString[$i];    }    $string = $tempString;}$sttime = microtime(true);$stmem = memory_get_usage();$str = '<p align="center"><b>123<br /><em>abc</em>45<hr />6</b>d<strong>efg<i>789</i></strong></p>';$size=15;$reserved = array //保留标签(    '<br />',    '<br>',    '<hr />',    '<hr>',    '<img />',    '<img>');$string[]='';                                                  // 保存所有标签$number[][]=0;                                                 // 保存所有标签位置$saveString = '';                                              // 保存截取标签后的所有字符串$newString  = '';                                              // 保存所有未截取标签的字符串find($str, $size, $string, $number, $saveString, $newString);  // 查找标签deleteReservedTag($string, $number, $reserved);                // 从标签组里去除 保留标签compare($string, $number);                                     // 从标签组里去除 成对标签//deleteSpaceArray($string, $number);                          // 删除标签组里空下来的空间//deleteSpaceArray($string, $number);                          // 删除标签组里空下来的空间replace($string, $number, $newString);printf("截取长度: %u\n\n", $size);printf("完整长度: %s\n\n", $str);printf("截取长度: %s  (%u)\n\n", $saveString, strlen($saveString));printf("处理结果: %s\n\n", $string);printf("未处理前: %s\n\n", $newString);printf("内存使用情况:%u\n", memory_get_usage()-$stmem);printf("算法运行时间(microtime): %f\n", microtime(true)-$sttime);?>

研究得好透彻啊   

人都去那了啊,郁闷了

$s = '123<em>abc</em>456<em>def</em>789<em>def</em>789<em>def</em>789<em>def</em>789';function subs($s, $len){//此函数参数有二:$s - 源字符串,    $len - 要截取的长度        (当让你也可以将标签传进来,不过要进行其他操作)    $s1 = $s;    $s1 = preg_replace('/<\/?em>/s', '', $s1);    $sub = mb_substr($s1, 0, $len, 'gbk');    //处理成数组    $s2 = $s;    $s2 = preg_replace('/<\/?em>/s', '[p]', $s2);    $arr = explode('[p]', $s2);    $arr1 = $arr2 = array();    $num = count($arr);    $num1 = $num2 = 0;    $bs = 0;    for($i = 0; $i < $num; $i++){        $arr1[] = strlen($arr[$i]);        $num2 = array_sum($arr1);        if($num2 >= $len){            $num1 = $len - $num2 + strlen($arr[$i]);            if($num1 != strlen($arr[$i]))$bs = 1            $s3 = mb_substr($arr[$i], 0, $num1, 'gbk');            $arr[$i] = $s3;            $arr2 = array_slice($arr, 0, $i + 1);            break;        }    }    //处理数组,结合成所需要的成字符串    $num = count($arr2);    $s4 = '';    for($i =  0; $i < $num; $i++){        if($i % 2 == 0){            if(($i + 1 == $num && $bs == 1) || ($i + 2 == $num && $bs == 1) || ($num % 2 == 1 && $i + 1 == $num)){                $s4 .= $arr2[$i];            }else{                $s4 .= $arr2[$i]."&lt;em&gt;";            }        }else{            if($i + 1 == $num && $bs == 1){                $s4 .= $arr2[$i];            }else{                $s4 .= $arr2[$i]."&lt;/em&gt;";            }        }    }    //返回结果    return $s4;}$s = subs($s, 17);echo $s;

支持盗版!!!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。