恶搞 关于腾讯的那道题截取字符串的题
题目是: 123 123 P4+768MB 机运行速度如下 欢迎各位 PHP 爱好者来 QQ群:23930992 程序处理一些特殊数据的时候会出问题,请把代码粘贴到上面 又修正一个错误,请把下面代码粘贴到上面
假设有"123abc456def789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。
要求:
1 和标记不得计算在长度之内。
2 截取后的字符串,要保留原有标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。
示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123abc45。
<?php// QQ群:23930992function find($str, $size, &$string, &$number, &$saveString, &$newString) // 查找标签,当 PHP > 5.3 可以把注释去掉{ $i=$j=0; while(strlen($saveString)<$size) { //loop: if($str[$i] == '<') { $k=0; $number[$j][$k++]=$i; $string[$j]=''; do { $string[$j].=$str[$i]; if($str[$i] == '>') { $number[$j++][$k++]=$i; break; } }while($str[$i++] != '>'); } else { $saveString.=$str[$i]; /*if(strlen($saveString) == $size) { if($str[++$i] =='<') { goto loop; } $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; 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; } } } } $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;}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] = NULL; $string[$j] = NULL; for($k=0;$k<2;$k++) { $number[$i][$k] = NULL; } for($k=0;$k<2;$k++) { $number[$j][$k] = NULL; } } } } $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;}function replace(&$string, $number, $newString){ $tempString = ''; $saveStringLength = strlen($newString); $stringLength = count($string); //echo $saveStringLength."\n".$stringLength; for($i=0, $j=0; $i < $saveStringLength; $i++) { if( $j < $stringLength ) { if( $i == $number[$j][0]) { $begin = $number[$j][1] - $number[$j][0]; while($begin) { $begin--; $i++; } $j++; $i++; } } $tempString .= $newString[$i]; } $string = $tempString;}$str = '<p align="center"><b>123<br /><em>abc</em>45<hr />6</b>defg<i>789</i></p>';$size=15;$reserved = array //保留标签( '<br />', '<br>', '<hr />', '<hr>');$string[]=''; // 保存所有标签$number[][]=0; // 保存所有标签位置$saveString = ''; // 保存截取标签后的所有字符串$newString = ''; // 保存所有未截取标签的字符串find($str, $size, $string, $number, $saveString, $newString); // 查找标签deleteReservedTag($string, $number, $reserved); // 从标签组里去除 保留标签compare($string, $number); // 从标签组里去除 成对标签replace($string, $number, $newString);printf("截取长度:%d\n\n", $size);printf("完整长度:%s\n\n",$str);printf("处理结果:%s\n\n", $string);printf("截取长度:%s (%s)\n\n",$saveString,strlen($saveString));printf("未处理前:%s\n",$newString);?>
运算结果如下
------------------------------------------------------------------------------------
截取长度:15
完整长度:
abc45
6defg789
处理结果:123
abc45
6defg78
截取长度:123abc456defg78 (15)
未处理前:
abc45
6defg78
回复讨论(解决方案)
内存使用情况:2176
算法运行时间(microtime):0.0012378692626953
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 replace(&$string, $number, $newString){ $tempString = ''; $saveStringLength = strlen($newString); $stringLength = count($string); for($i=0, $j=0; $i < $saveStringLength; $i++) { if( $j < $stringLength ) { if( $i == $number[$j][0]) { $begin = $number[$j][1] - $number[$j][0]; while($begin) { $begin--; $i++; } $j++; } } else { $tempString .= $newString[$i]; } } $string = $tempString;}
完整修改后的代码
<?php// QQ群:23930992function find($str, $size, &$string, &$number, &$saveString, &$newString) // 查找标签,当 PHP > 5.3 可以把注释去掉{ $i=$j=0; while(strlen($saveString)<$size) { //loop: if($str[$i] == '<') { $k=0; $number[$j][$k++]=$i; $string[$j]=''; do { $string[$j].=$str[$i]; if($str[$i] == '>') { $number[$j++][$k++]=$i; break; } }while($str[$i++] != '>'); } else { $saveString.=$str[$i]; /*if(strlen($saveString) == $size) { if($str[++$i] =='<') { goto loop; } $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; } } } } $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;}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] = NULL; $string[$j] = NULL; for($k=0;$k<2;$k++) { $number[$i][$k] = NULL; } for($k=0;$k<2;$k++) { $number[$j][$k] = NULL; } } } } $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;}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 = ' <table id="ctl00_ContentPlaceHolder1_BidDomainName1_Shop1_htmlShop" width="99%" border="0" cellspacing="0" cellpadding="0"> <tr> <td valign="top"><img src="/static/imghw/default1.png" data-src="http://auction.ename.cn/images/nopic.gif" class="lazy" id="ctl00_ContentPlaceHolder1_BidDomainName1_Shop1_imgShopLogo" style="max-width:90%" / alt="恶搞 关于腾讯的那道题截取字符串的题" ></td> <td><h5 id="的玉米小店">364867的玉米小店</h5> 买家信用:<a id="ctl00_ContentPlaceHolder1_BidDomainName1_Shop1_hlBuyerCreditLink" title="0" href="/Customer/UserEvaluate.aspx?uid=364867&from=seller" target="_blank">0<span class="goodssaletitle2"></span></a><br /> 卖家好评率:100.00%<br /> 买家好评率:0.00%<br /> 注册时间:2010年04月29日<br /> <div style="width:230px">荣誉资质:<img src="/static/imghw/default1.png" data-src="/images/scicon.gif" class="lazy" alt="恶搞 关于腾讯的那道题截取字符串的题" ></div> <div><a id="ctl00_ContentPlaceHolder1_BidDomainName1_Shop1_hlShopUrl" href="http://364867.shop.ename.cn"><img src="/static/imghw/default1.png" data-src="/images/scicon.gif" class="lazy" style="max-width:90%" style="max-width:90%" border="0" / alt="恶搞 关于腾讯的那道题截取字符串的题" ></a></div></td> </tr></table> </td> </tr> <tr> <td class="shopbg04"> </td> </tr> </table>';$size=160;$reserved = array //保留标签( '<br />', '<br>', '<hr />', '<hr>', '<img / alt="恶搞 关于腾讯的那道题截取字符串的题" >', '<img alt="恶搞 关于腾讯的那道题截取字符串的题" >');$string[]=''; // 保存所有标签$number[][]=0; // 保存所有标签位置$saveString = ''; // 保存截取标签后的所有字符串$newString = ''; // 保存所有未截取标签的字符串find($str, $size, $string, $number, $saveString, $newString); // 查找标签deleteReservedTag($string, $number, $reserved); // 从标签组里去除 保留标签compare($string, $number); // 从标签组里去除 成对标签replace($string, $number, $newString);printf("截取长度:%d\n\n", $size);printf("完整长度:%s\n\n",$str);printf("处理结果:%s\n\n", $string);printf("截取长度:%s (%s)\n\n",$saveString,strlen($saveString));printf("未处理前:%s\n",$newString);echo "内存使用情况:",(memory_get_usage()-$stmem),"\n";echo "算法运行时间(microtime):",(microtime(true)-$sttime),"\n";?>
截取长度:160
完整长度:
![]() | 364867的玉米小店买家信用:0 卖家好评率:100.00% 买家好评率:0.00% 注册时间:2010年04月29日 荣誉资质: ![]() |
处理结果:

364867的玉米小店
买家信用:0
卖家好评率:100.00%
买家好评率:0.00%
注册
截取长度:
364867的玉米小店
买家信用:0
卖家好评率:100.00%
买家好评率:0.00%
注册 (160)
未处理前:
![]() | 364867的玉米小店买家信用:0 卖家好评率:100.00% 买家好评率:0.00% 注册 内存使用情况: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 / alt="恶搞 关于腾讯的那道题截取字符串的题" >', '<img alt="恶搞 关于腾讯的那道题截取字符串的题" >');$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; 로그인 후 복사 支持盗版!!! 본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
![]() 핫 AI 도구![]() Undresser.AI Undress사실적인 누드 사진을 만들기 위한 AI 기반 앱 ![]() AI Clothes Remover사진에서 옷을 제거하는 온라인 AI 도구입니다. ![]() Undress AI Tool무료로 이미지를 벗다 ![]() Clothoff.ioAI 옷 제거제 ![]() AI Hentai GeneratorAI Hentai를 무료로 생성하십시오. ![]() 인기 기사
R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
어 ass 신 크리드 그림자 : 조개 수수께끼 솔루션
2 몇 주 전
By DDD
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전
By 尊渡假赌尊渡假赌尊渡假赌
![]() 뜨거운 도구![]() 메모장++7.3.1사용하기 쉬운 무료 코드 편집기 ![]() SublimeText3 중국어 버전중국어 버전, 사용하기 매우 쉽습니다. ![]() 스튜디오 13.0.1 보내기강력한 PHP 통합 개발 환경 ![]() 드림위버 CS6시각적 웹 개발 도구 ![]() SublimeText3 Mac 버전신 수준의 코드 편집 소프트웨어(SublimeText3) ![]() 뜨거운 주제
Gmail 이메일의 로그인 입구는 어디에 있나요?
![]() ![]()
Cakephp 튜토리얼
![]() ![]()
Steam의 계정 이름 형식은 무엇입니까?
![]() ![]()
Win11 활성화 키 영구
![]() ![]()
NYT 연결 힌트와 답변
![]() ![]() ![]() Alipay PHP ... ![]() JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적, ![]() 기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능 ![]() 기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다. ![]() PHP 개발에서 PHP의 CURL 라이브러리를 사용하여 JSON 데이터를 보내면 종종 외부 API와 상호 작용해야합니다. 일반적인 방법 중 하나는 컬 라이브러리를 사용하여 게시물을 보내는 것입니다 ... ![]() 이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다. ![]() PHP 개발에서 견고한 원칙의 적용에는 다음이 포함됩니다. 1. 단일 책임 원칙 (SRP) : 각 클래스는 하나의 기능 만 담당합니다. 2. Open and Close Principle (OCP) : 변경은 수정보다는 확장을 통해 달성됩니다. 3. Lisch의 대체 원칙 (LSP) : 서브 클래스는 프로그램 정확도에 영향을 미치지 않고 기본 클래스를 대체 할 수 있습니다. 4. 인터페이스 격리 원리 (ISP) : 의존성 및 사용되지 않은 방법을 피하기 위해 세밀한 인터페이스를 사용하십시오. 5. 의존성 반전 원리 (DIP) : 높고 낮은 수준의 모듈은 추상화에 의존하며 종속성 주입을 통해 구현됩니다. ![]() 세션 납치는 다음 단계를 통해 달성 할 수 있습니다. 1. 세션 ID를 얻으십시오. 2. 세션 ID 사용, 3. 세션을 활성 상태로 유지하십시오. PHP에서 세션 납치를 방지하는 방법에는 다음이 포함됩니다. 1. 세션 _regenerate_id () 함수를 사용하여 세션 ID를 재생산합니다. 2. 데이터베이스를 통해 세션 데이터를 저장하십시오. ![]() |