-
-
/** - * fixHtmlTag
- *
- * html标签修复函数,此函数可以修复未正确闭合的 HTML 标签
- *
- * 由于不确定性因素太多,暂时提供两种模式“嵌套闭合模式”和
- * “就近闭合模式”,应该够用了。
- *
- * 这两种模式是我为了解释清楚此函数的实现而创造的两个名词,
- * 只需明白什么意思就行。
- * 1,嵌套闭合模式,NEST,为默认的闭合方式。即 "
你好"
- * 这样的 html 代码会被修改为 "
你好 "
- * 2. 가장 가까운 닫힘 모드, CLOSE. 이 모드는 "
Hello 왜
- * 닫힘이 없나요?" 형식으로 코드를 수정합니다. "
안녕하세요 왜 닫히지 않나요 "
- *
- * 중첩된 폐쇄 모드(기본값, 특별한 매개변수가 필요하지 않음)에서는 통과할 수 있습니다. 근처에서 닫아야 하는
- * 태그 이름에 이렇게 하면 "
Hello Me, too"와 같은 내용이
- 로 변환됩니다. * "
안녕하세요 안녕하세요 ".
- * 매개변수 전달 시 인덱스는 다음과 같이 작성해야 하며, 수정할 필요가 없는 설정은 생략 가능합니다.
- *
- * $param = array(
- * 'html' => ; '', //필수
- * 'options' => array(
- * 'tagArray' => array();
- * 'type' => 'NEST',
- * '길이' => ; 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 사양을 준수하지 않는 태그를 처리할지 여부는
- *
- * @author IT roly-poly
- * @version 0.2
- * @link http://bbs.it -home.org IT 텀블러
- * @link http://enenba.com/?post=19 XX
- * @param array $param 배열 매개변수, 특정 인덱스를 할당해야 함
- * @return string $result 처리된 HTML 코드
- * @since 2012-04-14
- */
- function fixHtmlTag ($param = array()) {
- //매개변수의 기본값
- $html = ''
- $tagArray = array()
- $type = 'NEST'
- $length = null;
- $lowerTag = TRUE;
- $XHtmlFix = TRUE
//먼저 $html 및 $options( 매개변수가 제공되는 경우)
- extract($param);
- < ;p>//옵션이 있는 경우 관련 변수 추출
- if (isset($options)) {
- extract($options);
- }
$ result = ''; //반환될 최종 HTML 코드
- $tagStack = array(); array_push() 및 array_pop()을 사용하여 스택을 시뮬레이션합니다.
- $contents = array(); // html 태그를 저장하는 데 사용됩니다.
- $len = 0; //문자열의 초기 길이
//닫는 태그 $isClosed를 설정합니다. 기본값은 TRUE입니다. 근처에서 닫아야 하는 경우 성공합니다. 시작 태그를 일치시킨 후 해당 값은 false이고, 성공적으로 닫힌 후에는 true입니다.
- $isClosed = true;
//처리할 모든 태그를 소문자로 변환
- $tagArray = array_map('strtolower', $tagArray);
//"법적" 단일 닫힌 태그
- $singleTagArray = array(
- '
- '
- '
- '
- '
- '
- '
- );
//$type 일치 패턴 확인, 기본값은 NEST 패턴입니다.
- $type = strtoupper($type)
- if (!in_array ($type, array('NEST', 'CLOSE'))) {
- $type = 'NEST';
- }
//< 및 > 쌍을 사용하여 원래 HTML 태그와 태그의 문자열을 array
- $contents = preg_split("/(<[^>] ?>)/si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
foreach ($contents as $tag) {
- if ('' == Trim($tag)) {
- $result .= $tag
- 계속
- } 🎜>
//
- if (preg_match(" /<(w )[^/>]*?/>/si"와 같은 표준 단일 폐쇄 태그와 일치합니다. $tag)) {
- $result .= $tag;
- continue;
- }
//단일 태그인 경우 시작 태그를 일치시킵니다. 스택에서 꺼내세요
- else if (preg_match("/<(w )[^/>]*?>/si", $ tag, $match)) {
- //If the 이전 태그가 닫혀 있지 않고 이전 태그가 가장 가까운 닫힌 유형에 속합니다
- //이전 태그를 닫고 이전 태그를 스택에서 팝
- < ;p>//라벨이 닫히지 않은 경우
- if (false === $isClosed) {
- //Nearby 닫기 모드, 근처의 모든 라벨을 직접 닫습니다
- if ('CLOSE' == $type) {
- $result .= '< /' . end($tagStack) . '>';
- array_pop($tagStack)
- }
- //기본 중첩 모드, 닫는 매개변수로 제공되는 태그
- if (in_array(end($tagStack), $tagArray)) {
- $result .= '' . '>
- >}
- }
- }
//$lowerTag 매개변수가 TRUE인 경우 태그 이름을 소문자로 변환합니다.
- $matchLower = $lowerTag == TRUE ? strtolower($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)
- }
- array_pop($tagStack)
- }
- }
- < ;p>//가장 가까운 닫힌 모드, 상태가 닫히지 않음으로 변경됩니다.
- if ('CLOSE' == $type) {
- $isClosed = false
- }
- //기본 중첩 모드, if 태그가 제공된 $tagArray에 있으면 상태가 닫히지 않음으로 변경됩니다.
- else {
- if (in_array($matchLower, $tagArray)) {
- $isClosed =
- }
- }
- unset($matchLower);
- }
//닫는 태그를 일치시키고 해당하는 경우 스택에서 팝합니다.
- else if (preg_match("/ (w )[^/>]*?>/si", $tag, $match)) {
//$lowerTag 매개변수가 TRUE인 경우, 소문자로 태그 이름 전송
- $matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $match[1];
if (end( $tagStack) == $matchLower) {
- $isClosed = true; //일치가 완료되고 태그가 닫힙니다
- $tag = str_replace('' . $match[1], '< ;/' . $matchLower, $tag );
- array_pop($tagStack)
- unset($matchLower); p>
//댓글 일치, $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;
- break;
- }
- }
/ /스택에 아직 닫히지 않은 태그가 있으면 $result
- while (!empty($tagStack)) {
- $result .= '' array_pop에 연결합니다. ($tagStack) .'> ;';
- return $result;
- }
- ?>
-
-
-
- 코드 복사
-
-
-
-
|