> 백엔드 개발 > PHP 튜토리얼 > 정상적으로 닫히지 않는 HTML 태그에 대한 코드 수정(중첩 및 근처 닫기 지원)

정상적으로 닫히지 않는 HTML 태그에 대한 코드 수정(중첩 및 근처 닫기 지원)

WBOY
풀어 주다: 2016-07-25 09:05:16
원래의
1175명이 탐색했습니다.
  1. /**

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

    Hello

  14. * 닫힘이 없나요?" 형식으로 코드를 수정합니다. "

    안녕하세요

    왜 닫히지 않나요

    "
  15. *
  16. * 중첩된 폐쇄 모드(기본값, 특별한 매개변수가 필요하지 않음)에서는 통과할 수 있습니다. 근처에서 닫아야 하는
  17. * 태그 이름에 이렇게 하면 "

    Hello

    Me, too"와 같은 내용이

  18. 로 변환됩니다. * "

    안녕하세요

    안녕하세요

    ".
  19. * 매개변수 전달 시 인덱스는 다음과 같이 작성해야 하며, 수정할 필요가 없는 설정은 생략 가능합니다.
  20. *
  21. * $param = array(
  22. * 'html' => ; '', //필수
  23. * 'options' => array(
  24. * 'tagArray' => array();
  25. * 'type' => 'NEST',
  26. * '길이' => ; null,
  27. * 'lowerTag' => TRUE,
  28. * 'XHtmlFix' => TRUE,
  29. * )
  30. * ); $param);
  31. *
  32. * 위 인덱스에 해당하는 값의 의미는 다음과 같습니다
  33. * string $html 수정해야 할 html 코드
  34. * array $tagArray 중첩된 경우 모드, 가장 가까운 닫힌 태그 배열이 필요합니다
  35. * string $type 모드 이름, 현재 NEST 및 CLOSE 모드를 지원합니다. CLOSE로 설정하면 $tagArray 매개변수의 설정이 무시되고 * ini $length 특정 길이를 자르려면 여기에서 할당할 수 있습니다. 이 길이는 문자열 길이를 나타냅니다.
  36. * bool $lowerTag 코드의 모든 태그를 소문자로 변환할지 여부, 기본값은 TRUE * bool $XHtmlFix XHTML 사양을 준수하지 않는 태그를 처리할지 여부는
  37. *
  38. * @author IT roly-poly
  39. * @version 0.2
  40. * @link http://bbs.it -home.org IT 텀블러
  41. * @link http://enenba.com/?post=19 XX
  42. * @param array $param 배열 매개변수, 특정 인덱스를 할당해야 함
  43. * @return string $result 처리된 HTML 코드
  44. * @since 2012-04-14
  45. */
  46. function fixHtmlTag ($param = array()) {
  47. //매개변수의 기본값
  48. $html = ''
  49. $tagArray = array()
  50. $type = 'NEST'
  51. $length = null;
  52. $lowerTag = TRUE;
  53. $XHtmlFix = TRUE

  54. //먼저 $html 및 $options( 매개변수가 제공되는 경우)

  55. extract($param);

  56. < ;p>//옵션이 있는 경우 관련 변수 추출
  57. if (isset($options)) {
  58. extract($options);
  59. }

  60. $ result = ''; //반환될 최종 HTML 코드

  61. $tagStack = array(); array_push() 및 array_pop()을 사용하여 스택을 시뮬레이션합니다.
  62. $contents = array(); // html 태그를 저장하는 데 사용됩니다.
  63. $len = 0; //문자열의 초기 길이

  64. //닫는 태그 $isClosed를 설정합니다. 기본값은 TRUE입니다. 근처에서 닫아야 하는 경우 성공합니다. 시작 태그를 일치시킨 후 해당 값은 false이고, 성공적으로 닫힌 후에는 true입니다.

  65. $isClosed = true;

  66. //처리할 모든 태그를 소문자로 변환

  67. $tagArray = array_map('strtolower', $tagArray);

  68. //"법적" 단일 닫힌 태그

  69. $singleTagArray = array(
  70. '
  71. '
  72. '
  73. '
  74. '
  75. '
  76. '
  77. );

  78. //$type 일치 패턴 확인, 기본값은 NEST 패턴입니다.

  79. $type = strtoupper($type)
  80. if (!in_array ($type, array('NEST', 'CLOSE'))) {
  81. $type = 'NEST';
  82. }

  83. //< 및 > 쌍을 사용하여 원래 HTML 태그와 태그의 문자열을 array

  84. $contents = preg_split("/(<[^>] ?>)/si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

  85. foreach ($contents as $tag) {

  86. if ('' == Trim($tag)) {
  87. $result .= $tag
  88. 계속
  89. }

    🎜>

    //

  90. if (preg_match(" /<(w )[^/>]*?/>/si"와 같은 표준 단일 폐쇄 태그와 일치합니다. $tag)) {
  91. $result .= $tag;
  92. continue;
  93. }

  94. //단일 태그인 경우 시작 태그를 일치시킵니다. 스택에서 꺼내세요

  95. else if (preg_match("/<(w )[^/>]*?>/si", $ tag, $match)) {
  96. //If the 이전 태그가 닫혀 있지 않고 이전 태그가 가장 가까운 닫힌 유형에 속합니다
  97. //이전 태그를 닫고 이전 태그를 스택에서 팝

  98. < ;p>//라벨이 닫히지 않은 경우
  99. if (false === $isClosed) {
  100. //Nearby 닫기 모드, 근처의 모든 라벨을 직접 닫습니다
  101. if ('CLOSE' == $type) {
  102. $result .= '< /' . end($tagStack) . '>';
  103. array_pop($tagStack)
  104. }
  105. //기본 중첩 모드, 닫는 매개변수로 제공되는 태그
  106. if (in_array(end($tagStack), $tagArray)) {
  107. $result .= '
  108. >}
  109. }
  110. }

  111. //$lowerTag 매개변수가 TRUE인 경우 태그 이름을 소문자로 변환합니다.

  112. $matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $ match [1];

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

  114. // 새 태그 조합 시작
  115. $result .= $tag;
  116. array_push($tagStack, $matchLower);

  117. //동의된 단일 태그에 속하면 닫혀 있음

  118. foreach ($singleTagArray as $singleTag) {
  119. if (stripos($tag, $singleTag) !== false) {
  120. if ($XHtmlFix == TRUE) {
  121. $tag = str_replace('>', ' />', $tag)
  122. }
  123. array_pop($tagStack)
  124. }
  125. }

  126. < ;p>//가장 가까운 닫힌 모드, 상태가 닫히지 않음으로 변경됩니다.
  127. if ('CLOSE' == $type) {
  128. $isClosed = false
  129. }
  130. //기본 중첩 모드, if 태그가 제공된 $tagArray에 있으면 상태가 닫히지 않음으로 변경됩니다.
  131. else {
  132. if (in_array($matchLower, $tagArray)) {
  133. $isClosed =
  134. }
  135. }
  136. unset($matchLower);
  137. }

  138. //닫는 태그를 일치시키고 해당하는 경우 스택에서 팝합니다.

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

  140. //$lowerTag 매개변수가 TRUE인 경우, 소문자로 태그 이름 전송

  141. $matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $match[1];

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

  143. $isClosed = true; //일치가 완료되고 태그가 닫힙니다
  144. $tag = str_replace('array_pop($tagStack)
  145. unset($matchLower); p>
  146. //댓글 일치, $result에 직접 연결

  147. else if (preg_match("//si", $tag))
  148. $result .= $tag;
  149. }

  150. //$result에 문자열을 넣고 잘라내기 작업을 수행합니다

  151. else {
  152. if (is_null( $length) || $len mb_strlen($tag) < $length) {
  153. $result .= $tag
  154. $len = mb_strlen($tag); str = mb_substr($tag, 0, $length - $len 1)
  155. $result .= $str;
  156. break;
  157. }
  158. }

  159. / /스택에 아직 닫히지 않은 태그가 있으면 $result

  160. while (!empty($tagStack)) {
  161. $result .= 'return $result;
  162. }
  163. ?>

  164. 코드 복사
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿