我已经创建了一个简单的PHP脚本,它可以解析HTML文档,并使用getElementByTagName和getAttribute返回元标记。如果HTML标签不是小写的,那么它就不会返回标签的内容。例如:
<title>My Title</title>将返回"My Title“,但是
<Title>My Title</Title>或
<TITLE>My Title</TITLE> 将不返回任何内容。有没有什么简单的方法可以让它匹配标签而不管大小写?我猜它可能涉及到正则表达式。
下面是代码示例:
$nodes = $doc->getElementsByTagName('title');
$heading = $doc->getElementsByTagName('h1');
$title = $nodes->item(0)->nodeValue;
$h1 = $heading->item(0)->nodeValue;
$metas = $doc->getElementsByTagName('meta');
for ($i = 0; $i < $metas->length; $i++)
{
$meta = $metas->item($i);
if($meta->getAttribute('name') == 'description')
$description = $meta->getAttribute('content');
if($meta->getAttribute('name') == 'keywords')
$keywords = $meta->getAttribute('content');
if($meta->getAttribute('name') == 'robots')
$robots = $meta->getAttribute('content');
}发布于 2014-05-02 22:10:04
DOMDocument::loadHtml()将所有元素转换为小写(并删除名称空间)。下面是一个小演示:
$html = <<<'HTML'
<html><Body><Title>My Title</Title></Body></html>
HTML;
$dom = new DOMDocument();
$dom->loadHtml($html);
echo $dom->saveHtml();<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><title>My Title</title></body></html>Xml区分大小写。因此,如果您将某些内容加载为XML,它将保持元素的原样:
$html = <<<'HTML'
<html><Body><Title>My Title</Title></Body></html>
HTML;
$dom = new DOMDocument();
$dom->loadXml($html);
echo $dom->saveXml();<?xml version="1.0"?>
<html><Body><Title>My Title</Title></Body></html>这将影响DOM方法和Xpath:
$html = <<<'HTML'
<html><Body><Title>My Title</Title></Body></html>
HTML;
$dom = new DOMDocument();
$dom->loadHtml($html);
var_dump(
// One element "title"
$dom->getElementsByTagName('title')->length
);
$xpath = new DOMXpath($dom);
var_dump(
// "title" as string
$xpath->evaluate('string(//title)')
);int(1)
string(8) "My Title"发布于 2014-05-02 20:58:20
根据您正在使用的内容,答案是否定的。getElementsByTagName用于解析XML,并且允许区分大小写的标记名。
你可以尝试每次迭代Title,tItle,tiTle等,但是你通常只会看到你提到的三个选项(全小写,首字母大写和全大写),这会让你的工作变得更容易。
发布于 2014-05-02 21:07:29
一个XML文档可以有两个不同的元素,分别命名为Title和title,这两个元素应该是不同的。将它们转换/处理为相同的名称是一个错误,可能会产生严重的后果。
但是,在您的示例中,可以使用XSLT将所有大写字符转换为小写字符,如this answer中所述。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vUpper" select=
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLower" select=
"'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[name()=local-name()]" priority="2">
<xsl:element name="{translate(name(), $vUpper, $vLower)}"
namespace="{namespace-uri()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="*" priority="1">
<xsl:element name=
"{substring-before(name(), ':')}:{translate(local-name(), $vUpper, $vLower)}"
namespace="{namespace-uri()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*[name()=local-name()]" priority="2">
<xsl:attribute name="{translate(name(), $vUpper, $vLower)}"
namespace="{namespace-uri()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@*" priority="1">
<xsl:attribute name=
"{substring-before(name(), ':')}:{translate(local-name(), $vUpper, $vLower)}"
namespace="{namespace-uri()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/23426745
复制相似问题