ホームページ > バックエンド開発 > PHPチュートリアル > 通常閉じられない HTML タグのコードを修正 (ネストと近くの閉じをサポート)

通常閉じられない HTML タグのコードを修正 (ネストと近くの閉じをサポート)

WBOY
リリース: 2016-07-25 09:05:16
オリジナル
1195 人が閲覧しました
  1. /**

  2. * fixHtmlTag
  3. *
  4. * html标签修复函数,此函数可以修复未正确闭合的 HTML 标签
  5. *
  6. * 由于不确定性因素太多,暂时提供两种模式“嵌套闭合模式”和
  7. * “就近闭合模式”,应该够用了。
  8. *
  9. * 这两种模式是我为了解释清楚此函数的实现而创造的两个名词,
  10. * 只需明白什么意思就行。
  11. * 1,嵌套闭合模式,NEST,为默认的闭合方式。即 "
    你好"
  12. * 这样的 html 代码会被修改为 "
    你好
    "
  13. * 2. 近くの終了モード、CLOSE。このモードは、「

    Hello

    Why is there no

  14. * Closed?」という形式のコードを「

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

    "
  15. *
  16. * ネストされた閉じモード (デフォルト、特別なパラメータは必要ありません) では、次のようにする必要がある
  17. * を渡すことができます。このように、「

    Hello

    Me,too」のようなものは

  18. * 「

    Hello<」に変換されます。 /p>

    "の形も好きです。
  19. * パラメータを渡す場合、インデックスは以下のように記述する必要があります。変更する必要のない設定は省略可能です
  20. *
  21. * $param = array(
  22. * 'html' => '', //必須
  23. * 'options' => ; array(
  24. * 'tagArray' => array();
  25. * 'type' => 'NEST',
  26. * 'length' => null,
  27. * ' lowerTag' => ; TRUE,
  28. * ' XHtmlFix' => TRUE,
  29. * )
  30. * );
  31. * fixHtmlTag($param);
  32. * string $html変更する必要がある HTML コード
  33. * array $tagArray は次のとおりです。ネスト モードの場合、最も近い閉じられたタグ配列が必要です。
  34. * string $type モード名。現在、NEST と CLOSE の 2 つのモードがサポートされています。CLOSE に設定されている場合、設定は次のようになります。パラメータ $tagArray は無視され、すべてのタグは最も近い
  35. * ini $length で閉じられます。特定の長さを切り詰めたい場合は、ここで値を割り当てることができます。この長さは文字列の長さを指します。 * bool $ lowerTag コード内のすべてのタグを小文字に変換するかどうか、デフォルトは TRUE です
  36. * bool $XHtmlFix XHTML 標準タグを処理するかどうか、つまり、

    に変換します。 * @author IT卤场
  37. * @version 0.2
  38. * @link http://bbs.it -home.org IT タンブラー
  39. * @link http://enenba.com/?post =19 XX
  40. * @param array $param 配列パラメータには特定のインデックスを割り当てる必要があります
  41. * @return string $result 処理された HTML コード
  42. * @since 2012-04-14
  43. */
  44. function fixHtmlTag($param = array() ) {
  45. $html = '';
  46. $tagArray = array();
  47. $length = TRUE;

  48. //まず 1 次元配列、つまり $html と $options (パラメーターが指定されている場合) を取得します

  49. extract($param);

  50. if (isset($options)) {
  51. extract($options)
  52. }< ;/p>
  53. $result = '';返されるコード

  54. $tagStack = array(); //array_push() と array_pop() でシミュレートされたタグ スタック
  55. $contents = array(); //HTML タグを格納するために使用されます
  56. $len = 0;文字列の長さ

  57. //終了マーク$isClosedを設定します。デフォルトはTRUEです。近くで閉じる必要がある場合は、開始タグとの一致に成功した後、その値はfalseになります。閉じると、これは true です

  58. $isClosed = true;

  59. //処理するすべてのタグを小文字に変換します

  60. $tagArray = array_map('strto lower ', $tagArray);

  61. //「正当な」単一の閉じられたタグ

  62. $singleTagArray = array(
  63. '
  64. '
  65. '
  66. '
  67. '< ;hr',
  68. '
  69. '
  70. );

  71. //検証一致パターン $type 、デフォルトは NEST モードです

  72. $type = strtoupper($ type);
  73. if (!in_array($type, array('NEST', 'CLOSE'))) {
  74. $type = 'NEST';// ペアの使用< と > を区切り文字として、元の HTML タグとタグ内の文字列を配列に入れます
  75. $contents = preg_split("/(<[^> ]+?>)/si", $html , -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

  76. foreach ($contents as $tag) {

  77. if ('' == trim($ tag)) {
  78. $result .= $tag;
  79. Continue;
  80. }

  81. //
    などの標準の単一の閉じたタグと一致します

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

  86. // 開始タグと一致し、それが単一タグの場合は、ポップスタックから削除します

  87. else if (preg_match("/<(w+)[^/>]*?>/si", $tag, $match)) {
  88. //if 前のラベルが閉じられていない場合、前のラベルは最も近い閉じたタイプに属します
  89. //それを閉じて前のラベルをポップします

  90. //ラベルが閉じていない場合

  91. if (false === $ isClosed) {
  92. //近くを閉じるモード、近くにあるすべてのタグを直接閉じます
  93. if ('CLOSE' == $type) {
  94. $result .= ''; );
  95. }
  96. //デフォルトのネスト モード、最も近い終了パラメータによって提供されるタグ
  97. else {
  98. if (in_array(end($tagStack), $tagArray)) {
  99. $result .= '< ;/' . ($tagStack) '>array_pop($tagStack);

  100. //パラメータ $ lowerTag が TRUE の場合、タグ名を小文字に変換します

  101. $matchLower = $ lowerTag == TRUE ? strto lower($match[1]) : $match[1] ;

  102. $tag = str_replace('<' . $match[1], '<' . $matchLower, $tag);

  103. //新しいタグの組み合わせを開始します
  104. $result . = $tag;
  105. array_push($tagStack, $matchLower);

  106. // 合意された単一タグに属している場合は、それを閉じてスタックから取り出します

  107. foreach ($singleTagArray as $singleTag) {
  108. if (stripos($tag, $singleTag) !== false) {
  109. if ($XHtmlFix == TRUE) {
  110. $tag = str_replace('>', ' />', $ tag);
  111. }
  112. array_pop($tagStack);
  113. }
  114. }

  115. //ニアクローズモード、ステータスが非クローズに変更

  116. if ('CLOSE' == $type) {
  117. $ isClosed = false;
  118. }
  119. //デフォルトのネスト モード、タグが指定された $tagArray にある場合、ステータスは unclosed に変更されます
  120. else {
  121. if (in_array($matchLower, $tagArray)) {
  122. $isClosed = false;
  123. }
  124. }
  125. unset($matchLower);
  126. }

  127. //必要に応じて終了タグをマッチさせてスタックからポップします

  128. else if (preg_match("/ ]*?>/si", $tag, $match)) {

  129. //パラメータ $ lowerTag が TRUE の場合、タグ名を次のように変換しますlowercase

  130. $matchLower = $ lowerTag == TRUE ? strto lower($match[1]) : $match[1];

  131. if (end($tagStack) == $matchLower) {

  132. $isClosed = true; //マッチ完了、タグクロージャ
  133. $tag = str_replace('
  134. array_pop($tagStack);
  135. }
  136. unset($matchLower);
  137. }

  138. // $result を直接接続します

  139. else if (preg_match("// si", $tag)) {
  140. $result .= $tag;
  141. }

  142. //文字列を $result に入れて切り捨て操作を実行します

  143. else {
  144. if (is_null ($length) || $len + mb_strlen($tag) < $length) {
  145. $result .= $tag;
  146. $len += mb_strlen($tag); }
  147. $str = mb_substr($ tag, 0, $length - $len + 1);
  148. $result .= $str;
  149. }
  150. }
  151. }

  152. //スタックには未使用の値がまだあります。閉じられたタグは $result

  153. while (!empty($tagStack)) {
  154. $result .= '}
  155. $result を返す
  156. }
  157. ?>

  158. コードをコピーします
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート