- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我遇到了以下问题,想知道您是否有建议。
所见即所得的编辑器允许用户上传和嵌入图像。然而,我的用户大多是科学家,但对如何使用 HTML 甚至如何为网页正确调整图像大小一无所知。这就是为什么我在服务器端自动将图像调整为缩略图和完整 View 大小的原因。单击缩略图将打开一个包含完整图像的灯箱。
所见即所得编辑器将图像扔进<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>
中获取图像标记并将它们添加到 float 中的相应段落之前 <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>
所以我需要做的是获取编辑器生成的html的所有图像节点,处理它们,插入div并移除图像节点。在阅读了很多类似的问题之后,我遗漏了一些东西并且无法让它发挥作用。可能我仍然误解了 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);
}
}
我遇到的问题:
对于我遗漏的任何建议,我将不胜感激。我走在正确的轨道上还是应该完全不同?
比提前,保罗
最佳答案
应该这样做(demo):
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXML("<div>$xhtml</div>"); // we need the div as root element
// find all img elements in paragraphs in the partial body
$xp = new DOMXPath($dom);
foreach ($xp->query('/div/p/img') as $img) {
$parentNode = $img->parentNode; // store for later
$parentNode->removeChild($img); // unlink all found img elements
// create a element
$a = $dom->createElement('a');
$a->setAttribute('href', '/files/fullview/' . basename($img->getAttribute('src')));
$a->setAttribute('rel', sprintf('lightbox[group][%s]', $img->getAttribute('alt')));
$a->appendChild($img);
// prepend img src with path to thumbs and remove alt attribute
$img->setAttribute('href', '/files/thumbs' . $img->getAttribute('src'));
$img->removeAttribute('alt'); // imo you should keep it for accessibility though
// create the holding div
$div = $dom->createElement('div');
$div->setAttribute('class', 'custom');
$div->appendChild($a);
// insert the holding div
$parentNode->parentNode->insertBefore($div, $parentNode);
}
$dom->formatOutput = true;
echo $dom->saveXml($dom->documentElement);
关于php - 如何通过 PHP 的 DOMDocument 将内联图像正确替换为样式化的 float div?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594917/
我有 2 个“DOMDocument”对象 - $original 和 $additional。我想要的是从 $additional DOMDocument 中获取所有子级并将其附加到 $origin
我有 2 个“DOMDocument”对象 - $original 和 $additional。我想要的是从 $additional DOMDocument 中获取所有子级并将其附加到 $origin
我有一个代码可以将 XML 文件保存到我的目录中。它在我的本地主机和我的共享主机中实际上就像一个魅力,但它在我的 Linux VPS 中不起作用。 我总是遇到这个错误: 警告:DOMDocument:
我试图从某些网页中获取“链接”元素。我无法弄清楚我做错了什么。我收到以下错误: Severity: Warning Message: DOMDocument::loadHTML() [domdocum
有什么区别: Msxml2.DOMDocument Msxml2.XMLHTTP ?当然,另一个问题是哪一个最适合我的目的,如下所述? 上下文是这样的 - 我有代码可以多次调用来检索网页。我正在寻找执
安装后 Windows Server 2012 和 Windows Server 2016 原生支持哪些版本的 MSXML 和 DOMDocument? 最佳答案 Modern versions of
安装后 Windows Server 2012 和 Windows Server 2016 原生支持哪些版本的 MSXML 和 DOMDocument? 最佳答案 Modern versions of
我正在使用以下代码: $doc = new DOMDocument(); $doc->loadHTML("From: fsong | #001I hate you DomDocument :(.you
我使用 xml、xsl 截取服务器的响应并提取所需的片段,以根据客户端请求从服务器响应中提取 html 片段。例如,假设 $content 在我们处理它之前有服务器响应。 $dom = new
我之前在 RapidXml 中询问过一个类似的问题,我现在想知道,相同但使用 Xerces-C。 我正在开发一个需要解析 xml 的 C++ 应用程序。 考虑以下几点: xml文件:file1.xml
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How can I get an element's serialised HTML with PHP's
我有以下 test.php文件,当我运行它时,关闭 标签被删除。 loadHTML(' console.log("hello");
$dom = new DOMDocument('1.0', 'UTF-8'); $dom->loadHTML($content); $divs = $dom->getElementsByTagName
获得除png扩展名以外的所有图像? $xpath = new DOMXPath( $htmlget); $nodelist = $xpath->query("//img[!ends-wi
我想删除所有 script 元素以及此处的代码 aaa EOF; $dom = new DOMDocument(); $dom->loadHTML($pageFile); foreach (
我想制作一个函数,向给定 html 的根标签添加一些属性。 我正在这样做: $dom = new \DOMDocument(); $dom->loadHTML($content);
我想制作向给定 html 的根标记添加一些属性的函数。 我这样做: $dom = new \DOMDocument(); $dom->loadHTML($content); $
我想做的是从 body 标签中获取脚本,但只有包含文本而不是脚本链接的脚本 例如。 console.log("for a test run"); 不是具有文件 src 的脚本。 我想将这些脚本放在页尾
我正在使用 domDocument 来解析这个小的 html 代码。我正在寻找具有特定 id 的特定 span 标签。 Hello world 我的代码: $dom = new domDocument
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!