ホームページ >バックエンド開発 >PHPチュートリアル >文字列の傍受に関するテンセントの質問に対するパロディ
トピックは次のとおりです。
「123907fae80ddef53131f3292ee4f81644babcd1c6776b927dc33c5d9114750b586338456907fae80ddef53131f3292ee4f81644bdefd1c6776b927dc33c5d9114750b586338789」のような文字列があるとします。文字列とインターセプトされる長さを渡すことができる関数を作成します。 。インターセプトした結果を返します。
要件:
1 907fae80ddef53131f3292ee4f81644b および d1c6776b927dc33c5d9114750b586338 タグは長さにカウントされません。
2 文字列をインターセプトした後、元の 907fae80ddef53131f3292ee4f81644b タグは保持される必要がありますが、最後のタグが閉じられていない場合、その開始タグは削除されます。
例:
質問の文字列について、長さ 5 をインターセプトしたい場合は、返される文字列は次のようになります: 123ab。長さ 8 をインターセプトしたい場合は、123907fae80ddef53131f3292ee4f81644babcc69278b6c6dfeddaef1009ea06904f13a4b561c25d9afb9ac8dc4d70affff419123df250b2156c434f3390392d09b1c9563907fae80ddef53131f3292ee4f81644babcd1c6776b927dc33c5d9114750b586338 45
精简后的代码
<?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]."<em>"; } }else{ if($i + 1 == $num && $bs == 1){ $s4 .= $arr2[$i]; }else{ $s4 .= $arr2[$i]."</em>"; } } } //返回结果 return $s4;}$s = subs($s, 17);echo $s;
支持盗版!!!