다음 문제에 봉착하고 조언이 있는지 알고 싶습니다.PHP의 DOMDocument를 통해 스타일이 적용된 부동 div로 인라인 이미지를 올바르게 대체하는 방법은 무엇입니까?
WYSIWYG 편집기를 사용하면 이미지를 업로드하고 삽입 할 수 있습니다. 그러나 사용자는 주로 과학자이지만 HTML을 사용하는 방법이나 웹 페이지의 이미지 크기를 올바르게 조정하는 방법에 대한 지식이 없습니다. 그래서 이미지를 서버 측에서 자동으로 축소판 및 전체보기 크기로 다시 크기를 조정합니다. 미리보기 이미지를 클릭하면 라이트 박스가 전체 이미지로 열립니다.
WYSIWYG 에디터는이 같은 <p>
태그 (마지막 단락 참조)로 이미지를 던졌습니다 :
<p>Intro Text</p>
<ul>
<li>List point 1</li>
<li>List point 2</li>
</ul>
<p>Some text before an image.
<img alt="Slide 1" src="/files/slide1.png" />
Maybe some text in between, nobody knows what the scientists are up to.
<img alt="Slide 2" src="/files/slide2.png" />
And even more text right after that.
</p>
내가 뭘하고 싶은 것은 <p>
태그에서 이미지를 가져 와서 각각의 단락 앞에 추가입니다 <div>
의 부동 내 :
<p>Intro Text</p>
<ul>
<li>List point 1</li>
<li>List point 2</li>
</ul>
<div class="custom">
<a href="/files/fullview/slide1.png" rel="lightbox[group][Slide 1]">
<img src="/files/thumbs/files/slide1.png" />
</a>
</div>
<div class="custom">
<a href="/files/fullview/slide2.png" rel="lightbox[group][Slide 2]">
<img src="/files/thumbs/files/slide2.png" />
</a>
</div>
<p>Some text before an image.
Maybe some text in between, nobody knows what the scientists are up to.
And even more text right after that.
</p>
그래서 내가해야 할 일을 그들에게, div의를 삽입하고 이미지 노드를 제거 에디터에 의해 생성 된 HTML, 프로세스의 모든 이미지 노드를 얻는 것입니다. 꽤 많은 비슷한 질문을 읽은 후에 무언가를 놓치고 작동시킬 수 없습니다. 아마, 나는 여전히 DOM 조작의 모든 개념을 오해하고있다. 여기에 내가 지금 틸 해낸 무엇 : 나는 우연히
// create DOMDocument
$doc = new DOMDocument();
// load WYSIWYG html into DOMDocument
$doc->loadHTML($html_from_editor);
// create DOMXpath
$xpath = new DOMXpath($doc);
// create list of all first level DOMNodes (these are p's or ul's in most cases)
$children = $xpath->query("/");
foreach ($children AS $child) {
// now get all images
$cpath = new DOMXpath($child);
$images = $cpath->query('//img');
foreach ($images AS $img) {
// get attributes
$atts = $img->attributes;
// create replacement
$lb_div = $doc->createElement('div');
$lb_a = $doc->createElement('a');
$lb_img = $doc->createElement('img');
$lb_img->setAttribute("src", '/files/thumbs'.$atts->src);
$lb_a->setAttribute("href", '/files/fullview'.$atts->src);
$lb_a->setAttribute("rel", "lightbox[slide][".$atts->alt."]");
$lb_a->appendChild($lb_img);
$lb_div->setAttribute("class", "custom");
$lb_div->appendChild($lb_a);
$child->insertBefore($lb_div);
// remove original node
$child->removeChild($img);
}
}
문제는 :
- `$의 atts`는 값으로 채워지지 않습니다. 올바른 속성 이름을 포함하지만 값이 누락되었습니다.
- 나는 그 권리를 이해한다면 자식의 부모 노드에서`insertBefore`가 호출되어야합니다. 따라서, 그것은`$ child-> parentNode-> insertBefore ($ lb_div, $ child); '가되어야하지만 부모 노드는 정의되지 않습니다.
- 원본 img 태그 제거가 작동하지 않습니다.
제가 누락 된 조언에 대해 감사드립니다. 나는 옳은 길을 가고 있는가? 아니면 완전히 다른 것인가? 사전에
Thans,
WYSIWYG 편집기가 올바른 XHTML을 작성합니까? – Gordon
편집기는 또는
태그를 추가하지 않지만 콘텐츠 자체는 실제로 유효합니다 (사용중인 편집기는 CKEditor). – Paul@ Paul : 코드에는 문제를 해결하고 개선하는 데 방해가되는 오류가 가득합니다. 오류보고를 활성화하고 오류를 표시하면 다음과 같이 처리 할 수 있습니다 :'error_reporting (-1); ini_set ('display_errors', 1); ' – hakre