ホームページ >php教程 >php手册 >PHP は、正常に閉じられない HTML タグの実装コードを修正しました (ネストと近くの閉じをサポート)

PHP は、正常に閉じられない HTML タグの実装コードを修正しました (ネストと近くの閉じをサポート)

WBOY
WBOYオリジナル
2016-06-13 11:59:481054ブラウズ

fixHtmlTag
version 0.2
这个版本解决了上次遗留的问题,即就近闭合和嵌套闭合问题。具体可以看代码的注释。

复制代码 代码如下:



/**
* fixHtmlTag
*
* HTML标签修复函数,此函数可以修复未正确闭合的 HTML 标签
*
* 由于不确定性因素太多,暂时提供两种模式“嵌套闭合模式”和
* “就近闭合模式”,应该够用了。
*
* 这两种模式是我为了解释清楚此函数的实现而创造的两个名词,
* 只需明白什么意思就行。
* 1,嵌套闭合模式,NEST,为默认的闭合方式。即 "

你好"
* 这样的 html 代码会被修改为 "
你好
"
* 2. 最も近い終了モード、CLOSE。このモードは、「

Hello

Why is there no
* Closed?」の形式でコードを変更します。 「

こんにちは

なぜ閉じられていないのですか


*
* ネストされたクローズドモード (デフォルト、特別なパラメータは必要ありません) では、次のように渡すことができます。近くで閉じる必要がある
* タグ名。このようにして、「

Hello

Me, too」のようなものは
* に変換されます。 「

こんにちは

こんにちは

」。
* パラメータを渡す場合、インデックスは以下のように記述する必要があります。変更する必要のない設定は省略可能です。
*
* $param = array(
* 'html' =>) ; '', //必須
* 'options' => array(
* 'tagArray' => array();
* 'type' => 'NEST',
* 'length' => ; null,
* ' lowerTag' => TRUE,
* 'XHtmlFix' => TRUE,
* )
* ); $param);
*
* 上記インデックスに対応する値の意味は以下の通りです
* string $html 修正が必要なHTMLコード
* array $tagArray ネストされている場合モード、最も近い閉じられたタグ配列が必要です
* string $type モード名、現在は NEST モードと CLOSE モードをサポートしています CLOSE に設定すると、パラメーター $tagArray の設定は無視され、すべてのタグが * ini $length 特定の長さを切り詰めたい場合は、ここで代入できます。この長さは文字列の長さを指します
* bool $ lowerTag コード内のすべてのタグを小文字に変換するかどうか、デフォルトは TRUE
* bool $XHtmlFix XHTML 仕様に準拠していないタグを処理するかどうか、
*
* に変換します。
* @version 0.2
* @link http://yungbo.com IT タンブラー
* @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'; ;
$ lowerTag = TRUE;
$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; //文字列の初期長

//近くで閉じる必要がある場合は、終了タグ $isClosed を設定します。開始タグの一致に成功すると値は false になり、正常に終了すると true になります。
$isClosed = true;

//処理するすべてのタグを小文字に変換します
$tagArray = array_map('strto lower', $tagArray);

//「有効な」単一の閉じられたタグ
$singleTagArray = array(
'''''''PHP は、正常に閉じられない HTML タグの実装コードを修正しました (ネストと近くの閉じをサポート));

//一致するパターン $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

foreach ($)内容を $tag として) {
if ('' == trim($tag)) {
$result .= $tag;
}

//Match;標準の単一終了タグ (

if (preg_match("/<(w )[^/>]*? />/si", $tag)) {
$result .= $tag;
continue;
}

// 開始タグと一致し、それが単一タグの場合はスタックからポップします
else if (preg_match(" /<(w )[^/>]*?>/si", $tag, $match)) {
//前のタグが閉じられておらず、前のラベルが最も近い閉じられたタグに属している場合type
// 次に、ラベルを閉じて前のラベルをポップします

// ラベルが閉じていない場合
if (false === $isClosed) {
/ /近くの閉じているモード,近くのすべてのタグを直接閉じます
if ('CLOSE' == $type) {
$result .= 'array_pop($tagStack) );
}
//デフォルトのネスト モード、最も近い終了パラメータによって提供されるタグ
else {
if (in_array(end($tagStack), $tagArray) ) {
$ result .= ''
}
}

;パラメータ $ lowerTag が TRUE の場合、タグ名を小文字に変換します
$matchLower = $ lowerTag == TRUE ? : $match[1]; ('<' . $match[1], '<' . $matchLower, $tag);
//新しいタグの組み合わせを開始します
$result .= $tag>array_push; tagStack, $matchLower);

//合意された単一タグに属している場合は、タグを閉じてスタックから取り出します
foreach ($singleTagArray as $singleTag) {
if (tripos ($tag, $singleTag) !== false) {
if ($XHtmlFix == TRUE) {
$tag = str_replace('>', ' />', $tag); >}
array_pop($tagStack);
}
}

//クローズモードに近い場合、ステータスが非クローズに変わります
if ('CLOSE' == $type) {
$isClosed = false;
}
//タグが指定された $tagArray にある場合、ステータスは unclosed に変更されます
else {
if (in_array( $matchLower, $tagArray)) {
$isClosed = false;
}
unset($matchLower);

//終了タグと一致し、必要に応じてスタックから取り出します
else if (preg_match("/]*?>/si" , $tag, $match)) {

//パラメータ $ lowerTag が TRUE の場合、タグ名を小文字に変換します
$matchLower = $ lowerTag == TRUE ? ) : $match[ 1];

if (end($tagStack) == $matchLower) {
$isClosed = true; // マッチが完了し、タグが閉じられます
$ tag = str_replace('$result .= $tag($tagStack); >}
unset($matchLower );
}

//コメントを照合し、$result を直接接続します
else if (preg_match("/