ホームページ  >  記事  >  バックエンド開発  >  PHPフィルタリングHTML文字列関数の詳しい説明_PHPチュートリアル

PHPフィルタリングHTML文字列関数の詳しい説明_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:40:31825ブラウズ

/*************************************************** * ****************
* プロセスの説明:
* 要件を満たすパラメーターがフィルター関数に渡されると、最初に filter() 関数がすべての文字列をフィルターします
*フィルタリング対象のタグ$tagをpreg_match_all()
*で取り出し、preg_match_allの一致する配列をループし、preg_split()で各タグを「左の属性」=「右の値」の形に分割する
*関数を実行すると、キーが保存されます
* 残りの属性配列をループし、preg_split() で一致した内容を取り出し、
* 置換可能な値を形成します。 最後に、str_replcae() を使用して文字列内の対応するラベルを置き換えます
*関数リスト:
* 関数 filter(& $str,$tag,$keep_attribute)
* 関数 match($reg,&$str,$arr)
* 関数 show($str,$title=,$debug = True)
* 使用例:
* //捜狐ニュースのホームページを取得
* $str = @file_get_content("http://news.sohu.com");
* //Filter
* filter($str,a,href, target,alt);
* filter( $str,p,align);
* show($str, フィルターされたコンテンツ);
********************* ********* ***************************************/

$start_time = array_sum(explode(" ",microtime()));

$str = <<< HTML
サイト a
サイト b
サイト c
サイト d
サイト e

adasdfasdf


asdfasdfasdfasdf


asdfasdfasdf



asdfadsfasdf
asdfasdfadf
asdfasdf
HTML;

//显示原字串
show($str,Html);

/************************************************* ************************************************* ************************************************* *****************/
//过滤
filter($str,a,href,target,alt);
filter($str,p,align);
filter($str,font,color,alt) ;

//実行後の内容を表示
show($str,Result);

//実行時間を表示
$run_time = array_sum(explode(" ",microtime())) - $start_time;
echo(< ;center>スクリプト実行時間: .$run_time.);

/**
* 説明: HTML 文字列のフィルター
* パラメーター:
* $str: フィルターされる HTML 文字列
* $tag: フィルターされるタグのタイプ
* $keep_attribute:
* 保持される属性。このパラメーターの形式は次のとおりです
* href
* href,target,alt
* array(href,target,alt)
*/
function filter(&$str,$tag,$keep_attribute) {

//检查要保持プロパティのパラメータ传递方式
if(!is_array($keep_attribute)) {
//含まれていない号時,切分パラメータが数组
$keep_attribute =explode(,,$keep_attribute) ;
}else {
//纯字串,构造数组
$keep_attribute = array($keep_attribute);
}
}

echo("·过滤[$tag]标签, 保持属性:".implode(,, $keep_attribute).
);

//必要なすべての処理の标记
$pattern = "/<$tag(.*)/i";
preg_match_all($pattern, $str,$out);

//循環处処理每个标记
foreach($out[1] as $key => $val) {
//取得a标记中有几个=
$cnt = preg_split (/ *=/i,$val);
$cnt = count($cnt) -1;

//构造適合正则
$pattern = ;
for($i=1; $i<=$cnt; $i ) {

$pattern .= ( .*=.*);
}
// 正则表达式形成を完了,如/(.*/iの样式
$pattern = "/(<$tag)$pattern(>.*)/i";

//予約を取得プロパティ
$replacement = match($pattern,$out[0][$key],$keep_attribute);

//代替
$str = str_replace($out[0][$key],$replacement,$str );
}
}

/**
* 説明: タグを構築し、保持する属性を保持します
* パラメーター: $reg: パターン、preg_match の式
* $str: 文字列、HTML 文字列
* $arr: 配列、保持する属性
* 戻り値:
*
* e.com
などの保持されたタグを返します。*/
function match($reg,&$str,$arr) {

//match
preg_match($reg,$str,$out);

//予約された属性
$keep_attribute = ;
foreach($arr as $k1=>$v1) {
//保持する定義済み属性の配列
foreach($out as $k2=>$v2) {
//マッチング後の配列 =
$attribute = trim(substr($v2,​​0,strpos($v2,​​=)));
//=前の
if($v1 == $attribute) {
//保持属性は、一致する値の = より前の部分と同じです
$keep_attribute .= $v2;
//この一致する部分の値を保存します
}
}
}

//戻り値を構築します。構造は次のとおりです。 : aadd
$keep_attribute = $out[1].$keep_attribute.($out[count($out)-1]);
//Return value
Return $keep_attribute ;
}

/**
* 文字列の内容を表示します
*/
function show($str,$title=,$debug = True) {
if($debug) {
if(is_array($str) ) {
$str = print_r($str,True);
}
$txtRows = count(explode(" ",$str)) 1;
echo($title.: