我最初使用Regex就这些问题提出了一个问题,但建议使用PHP DOM库来代替......这是优越的,但我仍然卡住了.
基本上,我想将一个内容包装成<a>一个<span>如果它还没有被包装<span>.
<?php
$input = <<<EOT
<html><head></head>
<body bgcolor="#393a36">
<a href="#"><span style="color:#ffffff;">Link 1</span></a>
<a href="#">Link 2</a>
<a href="#"><img src="mypic.gif" />Image Link</a>
<a href="#"><u>Underlined Link</u></a>
</body>
</html>
EOT;
$doc = new DOMDocument();
$doc->loadHTML($input);
$tags = $doc->getElementsByTagName('a');
foreach ($tags as $tag) {
$spancount = $tag->getElementsByTagName("span")->length;
if($spancount == 0){
$content = nodeContent($tag);
$element = $doc->createElement('span');
$element->setAttribute('style','color:#ffffff;');
$frag = $doc->createDocumentFragment();
$frag->appendXML($content);
$element->appendChild($frag);
$tag->nodeValue = ""; //clear node
$tag->appendChild($element);
}
}
echo $doc->saveHTML();
function nodeContent($n, $outer=false) {
$d = new DOMDocument('1.0');
$d->formatOutput = true;
$b = $d->importNode($n->cloneNode(true),true);
$d->appendChild($b);
$h = $d->saveHTML();
// remove outter tags
if (!$outer) $h = substr($h,strpos($h,'>')+1,-(strlen($n->nodeName)+4));
return $h;
}
Run Code Online (Sandbox Code Playgroud)
它提供了这个输出:
PHP警告:DOMDocumentFragment :: appendXML():实体:第1行:解析器错误:/ private/var/folders/78/78vHGigZHcuFeXB1KKJSb ++++ TI/-Tmp-/untitled_3xd中标记img第1行中数据的提前结束.第24行的.php
PHP警告:DOMDocumentFragment :: appendXML():第24行的/private/var/folders/78/78vHGigZHcuFeXB1KKJSb++++TI--Tmp-/untitled_3xd..php中的图像链接PHP警告:DOMDocumentFragment: :appendXML():^/in /private/var/folders/78/78vHGigZHcuFeXB1KKJSb++++TI/-Tmp-/untitled_3xd..php第24行PHP警告:DOMNode :: appendChild():文档片段在/中为空第25行上的private/var/folders/78/78vHGigZHcuFeXB1KKJSb ++++ TI/-Tmp-/untitled_3xd..php
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head></head>
<body bgcolor="#393a36">
<a href="#"><span style="color:#ffffff;">Link 1</span></a>
<a href="#"><span style="color:#ffffff;">Link 2</span></a>
<a href="#"><span style="color:#ffffff;"></span></a>
<a href="#"><span style="color:#ffffff;"><u>Underlined Link</u></span></a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这主要是有效的,除了它真的很挑剔,并且你可以看到它死了,如果这里是一个img(或类似的)标签a href.
什么是使这项工作的最佳方式.我现在一直在为一个令人尴尬的尴尬而奋斗.
编辑
根据以下反馈,这里是修改后的代码和输出.请注意,img标记之前的文本由于某种原因未被包装.有任何想法吗?
$doc = new DOMDocument();
$doc->loadHTML($input);
$tags = $doc->getElementsByTagName('a');
foreach ($tags as $tag) {
$spancount = $tag->getElementsByTagName("span")->length;
if($spancount == 0){
$element = $doc->createElement('span');
$element->setAttribute('style','color:#ffffff;');
foreach ($tag->childNodes as $child) {
$tag->removeChild($child);
$element->appendChild($child);
}
$tag->appendChild($element);
}
}
echo $doc->saveHTML();
Run Code Online (Sandbox Code Playgroud)
输出:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head></head>
<body bgcolor="#393a36">
<a href="#"><span style="color:#ffffff;">Link 1</span></a>
<a href="#"><span style="color:#ffffff;">Link 2</span></a>
<a href="#">Image Link<span style="color:#ffffff;"><img src="mypic.gif"></span></a>
<a href="#"><span style="color:#ffffff;"><u>Underlined Link</u></span></a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
irc*_*ell 10
为什么要重新创建节点呢?为什么不直接替换节点?(如果我明白你要做什么)......
if($spancount == 0){
$element = $doc->createElement('span');
$element->setAttribute('style','color:#ffffff;');
$tag->parentNode->replaceChild($element, $tag);
$element->apendChild($tag);
}
Run Code Online (Sandbox Code Playgroud)
编辑哎呀,看起来你正试图将所有东西都包裹$tag在范围内......试试这个:
if($spancount == 0){
$element = $doc->createElement('span');
$element->setAttribute('style','color:#ffffff;');
foreach ($tag->childNodes as $child) {
$tag->removeChild($child);
$element->appendChild($child);
}
$tag->appendChild($child);
}
Run Code Online (Sandbox Code Playgroud)
编辑2根据您的结果,由于节点删除,看起来foreach没有完成...尝试用以下方法替换foreach:
while ($tag->childNodes->length > 0) {
$child = $tag->childNodes->item(0);
$tag->removeChild($child);
$element->appendChild($child);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6683 次 |
| 最近记录: |