2011-04-13 2 views
2

너무 오래 동안이 하나에 내 머리를 긁적있다 ...값에 여러 단어가있는 속성이있는 DOMNode-> 속성 사용 문제

$dom = new DOMDocument(); 
$dom->loadHTML($content); 

$links = $dom->getElementsByTagName('a')->item(0); 
foreach ($links->attributes as $attribute) { 
    $name = $attribute->nodeName; 
    $value = str_replace('"', '', stripslashes($attribute->nodeValue)); 
    echo "$name: $value<br />"; 
} 

내가 결국 가지고 내 코드가 있습니다 : php dom get all attributes of a node. 또한 다른 속성을 호출하여 getAttribute()를 호출하여 동일한 결과를 얻었는지 확인했습니다.

내가 시도하고있는 HTML은 간단합니다 :

<a id="testid" title="testtitle" name="this is a testname" href="http://example.com/">link!</a> 

다음과 같은 오류가 나타납니다.

Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: error parsing attribute name in Entity, line: 1 

내 스크립트가 출력 중입니다 :

id: testid 
title: testtitle 
name: this 
is: 
a: 
testname: 
href: http://example.com/ 

I 'name'속성이 한 단어 인 경우 결과가 제대로 작동한다고 덧붙여 야합니다.

분명히, 그것은 explode() 또는 무언가 어리석은 공간을 사용해야합니다. 모든 공간을 % 20 또는 다른 것으로 변환하지 않고이 문제를 해결할 수있는 방법이 있습니까 (링크를 넘어서는 다른 많은 콘텐츠가 있고 전체 콘텐츠 블록을 변환하지 않으려 고합니다).

+0

나를 위해 작동합니다. 어떤 PHP 버전을 사용하고 있습니까? –

+0

[DOM does not는 그런 것을 아무것도하지 않습니다] (http://codepad.viper-7.com/YqiUVN "Viper Codepad에서 위의 코드를 실행합니다"). 문제를 재현하는 코드 스 니펫을 제공하십시오. – Gordon

+0

PHP 사용 5.3.2. 나는 플러그인에서 이것을 실제로하고 있기 때문에 문제는 WordPress라고 생각한다. 포스트 컨텐트를 문자열로 사용하고 WP 값을 공급하려고 시도했지만, 내 자신의 문자열로 작업했지만 WP는 통과하지 않았습니다. 그 안에 뭔가 있어야합니다. 나는 사용자 정의 단축 코드로 전환 할 수 있습니다. 훨씬 쉽게. –

답변

4

name 속성은 문자, 숫자, 대시 밑줄 기간과 콜론에 한정되는 "NAME token"로 정의되는 id 특성과 동일한 공간을 공유한다.

해당 목록에 허용 된 공백이 없음을 유의하십시오.

PHP에서 사용하는 DOMDocument 파서의 일부 버전은 HTML 규정을 엄격하게 준수하며 사양 위반이있을 경우 을 잘못 쓰고 정기적으로 수행합니다. 이러한 경우 중 하나 일 수 있습니다. 이름 속성에서 공백을 제거하고 계속해서 문제가 있는지 확인하십시오.

+0

W3C의 자체 유효성 검사기는 name 속성의 공백에 대해 불평하지 않으며 링크 된 스펙은 "글자"에 공백이 포함되어 있는지 명확하게 말하지 않지만 CDATA는 "문서 문자 세트" . – Gordon

관련 문제