ホームページ  >  記事  >  バックエンド開発  >  記事要約を自動生成するコード【PHP版】_PHPチュートリアル

記事要約を自動生成するコード【PHP版】_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:55:31909ブラウズ

実装内容:HTMLコードを含むテキストを切り詰めますが、包含タグが閉じていなくても問題ありません。
注: これはサーバー側で使用するための PHP バージョンです。クライアント バージョンが必要な場合は、次の記事をお読みください。
BLOG などのプログラムを作成する場合、記事の前の部分を表示する必要があることがよくありますが、不適切な切り捨てにより、囲んでいるタグが破壊され、ドキュメント全体の構造が壊れる可能性があります。私の関数を使用すると、要求の厳しい状況でこの問題を解決できます。
この機能がサーバー側に適用されるかクライアント側に適用されるかを誰もが考慮する必要があります。この機能は実行するとマシンへの負荷が高くなる可能性があると考えられるため、セキュリティ要件が高くない場合はクライアントに配置できます。
対応するデータベース クエリも最適化されるように、この概要をデータ テーブルの別のフィールドに配置することをお勧めします。多くの時間を費やす代わりに少しのスペースを犠牲にするのは、それでも十分に得策です。
セキュリティの問題、主にコンテンツのセキュリティについてもう一度話しましょう。クライアントが通常の要約情報を変更しようとする場合、通常、BLOG の所有者がその権限を有しており、要約と原文との間の一貫性を破壊するのは彼自身の仕事です。コンテンツ以外のセキュリティはサーバー側で解決できます。したがって、この機能はクライアント側で使用することをお勧めします。
コアコード

コードをコピー コードは次のとおりです:

// PHP 4.3 以降が必要
define("BRIEF_LENGTH", 800);     //記事のブリーフィングの単語量
function Generate_Brief($text){
global $Briefing_Length; 
if(strlen($text) <= BRIEF_LENGTH ) return $text;    
$Foremost = substr($text, 0, BRIEF_LENGTH); 
$re = "/<(/?)(P|DIV|H1|H2|H3|H4|H5|H6|アドレス|プリ|テーブル|TR|TD|TH|入力|選択|テキストエリア|オブジェクト|A |UL|OL|LI|BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|SPAN)[^>]*(>?)/i"; 
$Single = "/BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT/i";    
$Stack = array(); $posStack = array(); 
preg_match_all($re,$Foremost,$matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE); 
/* [子マッチング仕様]:
$matches[$i][1] : 現在の 「<...>」かどうかを示すA "/" 文字 摩擦は終了部分です
$matches[$i][2]: 要素名。 
$matches[$i][3] : 右 > 「<...>」の 摩擦 */
for($i = 0 ; $i < count($matches); $i++){
if($matches[$i][1][0] == ""){
$Elem = $matches[$i][2][0]; 
if(preg_match($Single,$Elem) && $matches[$i][3][0] !=""){
続き; 
}
array_push($Stack, strtoupper($matches[$i][2][0])); 
array_push($posStack, $matches[$i][2][1]);          
if($matches[$i][3][0] =="") break; 
}else{
$StackTop = $Stack[count($Stack)-1]; 
$End = strtoupper($matches[$i][2][0]); 
if(strcasecmp($StackTop,$End)==0){
array_pop($Stack); 
array_pop($posStack); 
if($matches[$i][3][0] ==""){
$Foremost = $Foremost.">"; 
}
}
}
}
$cutpos = array_shift($posStack) - 1;    
$Foremost = substr($Foremost,0,$cutpos); 
$Foremost を返します。 
}; 
若遇到问题(発行上面的関数数对多字节字符集支持得不好) 不烦试试下面的这个!

function Generate_Brief($text){
global $Briefing_Length; 
mb_regex_encoding("UTF-8"); 
if(mb_strlen($text) <= BRIEF_LENGTH ) return $text;    
$Foremost = mb_substr($text, 0, BRIEF_LENGTH); 
$re = "<(/?)(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|OBJECT|A| UL|OL|LI|BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|SPAN)[^>]*(>?)"; 
$Single = "/BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|BR/i";    
$Stack = array(); $posStack = array(); 
mb_ereg_search_init($Foremost, $re, 'i'); 
while($pos = mb_ereg_search_pos()){
$match = mb_ereg_search_getregs(); 
/* [子マッチングの定式化]:
$matche[1] : 現在の "<...>" かどうかを示す "/" 文字 摩擦は終了部分です
$matche[2]: 要素名。 
$matche[3] : 右 > 「<...>」の 摩擦
*/
if($match[1]==""){
$Elem = $match[2]; 
if(mb_eregi($Single, $Elem) && $match[3] !=""){
続き; 
}
array_push($Stack, mb_strtoupper($Elem)); 
array_push($posStack, $pos[0]);          
}else{
$StackTop = $Stack[count($Stack)-1]; 
$End = mb_strtoupper($match[2]); 
if(strcasecmp($StackTop,$End)==0){
array_pop($Stack); 
array_pop($posStack); 
if($match[3] ==""){
$Foremost = $Foremost.">"; 
}
}
}
}
$cutpos = array_shift($posStack) - 1;    
$Foremost = mb_substr($Foremost,0,$cutpos,"UTF-8"); 
$Foremost を返します。 
}; 

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/318277.html技術記事内容: このセクションには HTML コードのテキストが含まれていますが、ロックされていないという問題は発生しません。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。