/**
* fixHtmlTag
*
* HTML标签修复函数,此函数可以修复未正确闭合的 HTML 标签
*
* 由于不确定性因素太多,暂时提供两种模式“嵌套闭合模式”和
* “就近闭合模式”,应该够用了。
*
* 这两种模式是我为了解释清楚此函数的实现而创造的两个名词,
* 只需明白什么意思就行。
* 1,嵌套闭合模式,NEST,为默认的闭合方式。即 "
你好"
* 这样的 html 代码会被修改为 "
你好
"
* 2. 近くの終了モード、CLOSE。このモードは、「
Hello
Why is there no
* Closed?」という形式のコードを「
なぜ閉じられていないのですか
"
*
* ネストされた閉じモード (デフォルト、特別なパラメータは必要ありません) では、次のようにする必要がある
* を渡すことができます。このように、「
Hello
Me,too」のようなものは
* 「
Hello<」に変換されます。 /p>
」の形も好きです。
* パラメータを渡す場合、インデックスは以下のように記述する必要があります。変更する必要のない設定は省略可能です
*
* $param = array(
* 'html' => '', //必須
* 'options' => ; array(
* 'tagArray' => array();
* 'type' => 'NEST',
* 'length' => null,
* ' lowerTag' => ; TRUE,
* ' XHtmlFix' => TRUE,
* )
* );
* fixHtmlTag($param);
* string $html変更する必要がある HTML コード
* array $tagArray は次のとおりです。ネスト モードの場合、最も近い閉じられたタグ配列が必要です。
* string $type モード名。現在、NEST と CLOSE の 2 つのモードがサポートされています。CLOSE に設定されている場合、設定は次のようになります。パラメータ $tagArray は無視され、すべてのタグは最も近い
* ini $length で閉じられます。特定の長さを切り詰めたい場合は、ここで値を割り当てることができます。この長さは文字列の長さを指します。 * bool $ lowerTag コード内のすべてのタグを小文字に変換するかどうか、デフォルトは TRUE です
* bool $XHtmlFix XHTML 標準タグを処理するかどうか、つまり、
を
に変換します。 * @author IT タンブラー
* @version 0.2
* @link http://yungbo.com IT roly-poly
* @link http://enenba.com/?post=19 XX
* @param array $param 配列パラメータには特定のインデックスを割り当てる必要があります
* @return string $result 処理された HTML コード
* @since 2012-04-14
*/
function fixHtmlTag($param = array()) {
// パラメータのデフォルト値
$html = '';
$type = 'NEST ';
$XHtmlFix = TRUE; /最初に 1 次元配列、つまり $html と $options を取得します (パラメーターが指定されている場合)
extract($param)
// オプションが存在する場合は、関連する変数を抽出します
if (isset($options)); {
extract($options);
}
$result = ''; //返される最終的な HTML コード
$tagStack = array () //array_push() と array_pop() でシミュレートされたタグ スタック$contents = array(); //HTML タグを格納するために使用されます
$len = 0; //文字列の初期長
//近くで閉じる必要がある場合、デフォルトは TRUE です。開始タグが正常に一致すると値は false になり、開始タグが正常に閉じられると true になります。
$isClosed = true;
//処理されるすべてのタグを小文字に変換します
$ tagArray = array_map( 'strto lower', $tagArray);
//「有効な」単一の閉じられたタグ
$singleTagArray = array(
''''
'
'');
//検証マッチングモード $type、デフォルトは NEST モードです
$type = strtoupper ($type);
if (!in_array($type, array('NEST', 'CLOSE'))) {
$type = 'NEST';
// < のペアを使用して、元のhtml タグとタグ内の文字列を配列に追加します
$contents = preg_split("/(<[^>]+?>)/si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); ($contents as $tag) {
if ('' == Trim($tag)) {
$result .= $tag;
Continue
}
//
if (preg_match("/<(w+)[^/>]*?/>/si", $tag)) {
$result .= $tag
}
// 開始タグに一致します。それが単一タグの場合、スタックからポップします
else if (preg_match("/<(w+)[^/>]*?>/si", $tag, $ match)) {
//前のラベルが閉じられておらず、前のラベルが最も近い閉じた型に属している場合
//それを閉じて、前のラベルをスタックからポップします
//ラベルが閉じられていない場合
if (false === $ isClosed) {
//クローズモードを閉じ、すべてのタグを直接閉じます
if ('CLOSE' == $type) {
$result .= '' . '>';
array_pop($tagStack);
}
//最も近い終了パラメータによって提供されるタグ
if (in_array(end($tagStack), $tagArray) {
$ result .= '< ;/' . end($tagStack) '>';
array_pop($tagStack)
}
} // パラメータ $ lowerTag が TRUE の場合、タグ名を次のように変換します。小文字
$matchLower = $ lowerTag == TRUE ? strto lower($match[1]) : $match[1];
$tag = str_replace('<' . $match[1] . $ matchLower, $tag);
//新しいタグの組み合わせを開始します
$result .= $tag;
array_push($tagStack, $matchLower); // 合意された単一のタグに属している場合は、それを閉じてポップしますスタックから
foreach ($singleTagArray as $singleTag) {
if (stripos($tag, $singleTag) !== false) {
if ($XHtmlFix == TRUE) {
$tag = str_replace('> ', ' />', $tag ; /デフォルトのネスト モード、タグが指定された $tagArray にある場合、ステータスは unclosed に変更されます
else {
if (in_array($matchLower, $tagArray)) {
$isClosed = false
}
}
unset($matchLower);
//終了タグと一致し、必要に応じてスタックから取り出します
else if (preg_match("/(w+)[^/>]*?>/si", $tag, $match )) {
//パラメータ $ lowerTag が TRUE の場合、タグ名を小文字に変換します
$matchLower = $ lowerTag == TRUE ? : $match[1]; end($tagStack) == $matchLower) {
$isClosed = true; //マッチが完了し、タグが閉じられます
$tag = str_replace('' . $match[1], ' ' . $matchLower, $tag);
$result .= $tag;
}
unset($matchLower)
// $result を直接接続します
else if ( preg_match("//si", $tag)) {
$result .= $tag;
}
//文字列を $result に入れて切り捨て操作を実行します
else {
if (is_null ($length) || $len + mb_strlen($tag) < $length) {
$result .= $tag;
$len += mb_strlen($tag); }
$str = mb_substr($ tag, 0, $length - $len + 1);
$result .= $str;
}
}
}
//スタック内に閉じられていないタグがある場合、それらを $result に接続します
while (!empty($tagStack)) {
$result .= '' . array_pop($tagStack)
}
return $result;
http://www.bkjia.com/PHPjc/325600.html
www.bkjia.com
truehttp://www.bkjia.com/PHPjc/325600.html
技術記事 fixHtmlTag バージョン 0.2 このバージョンでは、前回から残っている問題、つまり、近くの閉じの問題とネストされた閉じの問題が解決されます。詳細については、コードのコメントを参照してください。 コードをコピーします コードは次のとおりです: ?php /** * fi...