>  기사  >  php教程  >  PHP HTML 코드 문자열 차단 구현 코드

PHP HTML 코드 문자열 차단 구현 코드

黄舟
黄舟원래의
2016-12-14 13:19:331324검색

제공된 데이터는 다음과 같은 HTML 코드 문자열입니다.

Zhang San은 Li Si기사를 공유했습니다. 긴 문자열

인 경우 div 태그 내부의 콘텐츠를 가로채고 HTML 태그를 유지하며 그 안의 텍스트만 처리해야 합니다. 예를 들어 "lee思"에서 "lee"라는 단어를 그냥 가로챌 수도 있는데 이렇게 프런트엔드에 넣으면 "lee思" 앞에 있는 a 태그가 닫히지 않게 되므로 가로채고 난 후에는 HTML 구문이 올바른지 확인해야 합니다.

이 문제는 정말 해결하기 쉽지 않아서 이틀간 우울했어요. 이것은 단지 문자열이지만 내용은 HTML 코드이고 DOM이 없다는 점에 유의하십시오. 프런트 엔드에서 처리하면 더 쉬울 것입니다. DOM을 직접 얻은 다음 내부 노드를 처리하고 최종적으로 innerHTML과 같은 것을 출력할 수 있습니다. 지금은 안 돼요. 마음을 바꿔야 해요. 내 동료의 생각은 다음과 같습니다.

문자열의 각 문자를 탐색합니다. 태그를 설정하고 태그 시작 부분에서 < 태그를 발견하면 1로 설정합니다. 다음 문자는 계산되지 않으며 >를 만난 후에 계산을 시작합니다. 레이블 내부의 문자열을 처리할 때 먼저 현재 문자 인코딩이 중국어인지 여부를 확인해야 합니다. 일반적으로 PHP에서 UTF-8로 인코딩된 한자의 길이는 3이므로 한자 인코딩을 만나면 셀 수 없는 두 개는 건너뛰고... 이때부터 머리가 커지기 시작합니다. 개인적으로 이 방법은 매우 불쾌하다고 생각합니다. 우선 이런 정교한 논리는 제어하기가 쉽지 않으며 UFT-8 인코딩에서 생성된 중국어의 길이는 3 또는 4일 수 있으므로 코드의 엄격성이 의심됩니다. .

저의 개인적인 생각은 Tidy를 사용하는 것입니다(구체적인 사용법은 PHP 매뉴얼을 참조하세요). 어제 Tidy를 공부했는데 이것이 꽤 유용하다는 것을 알았습니다. 먼저 이 문자열을 다음과 같이 Tidy 객체로 변환합니다.

$tidy = tidy_parse_string($str, array(), 'utf8′) // 마지막은 인코딩을 설정하는 것입니다. utf-8이 아닌 utf8이며 중간 연결이 없습니다.

그런 다음 $tidy에서 본문을 가져옵니다(변환 후 $tidy는 와 같은 태그를 자동으로 추가하기 때문입니다).

$body = tidy_get_body($tidy) ;

이때 var_dump를 사용하여 일부 $body 구조를 살펴보면 각 태그를 해당 속성을 가진 해당 개체로 변환하는 것을 볼 수 있습니다. 예를 들어 sdf와 같은 문에 해당하는 일부 속성은 다음과 같습니다.

name=>”a”
value => "
sdf"
child=> 배열{[0]=>텍스트 노드 객체, 값은 sdf}
속성=배열{"href ”=>”#”}
…..기타 속성

보시다시피 실제로 a 레이블에 해당하는 노드 아래의 텍스트 노드 값을 별도로 처리할 수 있습니다. HTML 무결성은 파괴되지 않습니다. 원래는 a 태그의 text 노드 값을 변경하면 그에 따라 a 태그의 값도 변경되는 줄 알았는데, 그럴 경우에는 a 태그에 해당하는 노드의 값을 직접 반환하면 괜찮을 것 같습니다. 태그가 그럴 것이라고는 예상하지 못했습니다. 그래서 그 안에 있는 텍스트를 처리했습니다. 그런 다음 새 HTML을 직접 작성해야 합니다.

Tidy 객체의 구조를 알고 나면 모든 노드를 순회하기만 하면 됩니다. 이를 위해서는 div 태그를 찾은 다음 내부 노드 처리를 시작하면 됩니다. 코드는 다음과 같습니다:

if(mb_strwidth($subchild->value, 'utf-8′) >= $len)
{
$subchild->value = mb_strimwidth ($subchild ->value, 0, $len, '…', 'utf-8′);
$trimed_str .= $subchild->value;
break;
}
else
{
$trimed_str .= $subchild->value;
$len = $len - mb_strwidth($subchild->value, 'utf-8′);
}

내부의 $subchild는 하위 노드입니다. 여기서는 mb_strwidth를 사용하여 문자열 길이를 구합니다. 나는 이 mb_strwidth를 강력히 추천합니다. 매우 유용합니다. 중국어를 두 문자 길이로 처리하므로 여기의 요구 사항을 정확히 충족합니다! 또한, 문자열을 가로챌 때 mb_strimwidth가 사용됩니다. 이 함수는 중국어도 2개의 문자 길이로 처리합니다. mb_로 시작하는 함수는 정말 사용하기 쉽습니다.

요구사항에 따라 작성된 것이지 보편적인 형태로 만들어진 것이 아니기 때문에 구체적인 코드는 작성하지 않겠습니다. 언젠가는 그것을 보편적으로 만들어 출판할 시간이 있을 것이다.

또한 FireFox가 text-overflow 속성을 지원하지 않는다는 점이 아쉽습니다. 그렇지 않으면 백그라운드에서 텍스트를 자르기 위해 그렇게 열심히 노력할 필요가 없습니다. 더 좋은 방법이 있다면 토론 메시지를 남겨주시면 더 많은 관련 글을 보실 수 있으니 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.