Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getElementByTagName和getAttribute-PHP区分大小写_Php_Html_Xml_Regex - Fatal编程技术网

getElementByTagName和getAttribute-PHP区分大小写

getElementByTagName和getAttribute-PHP区分大小写,php,html,xml,regex,Php,Html,Xml,Regex,我创建了一个简单的PHP脚本,它解析HTML文档并使用getElementByTagName和getAttribute返回元标记。除了一件事之外,它工作得非常好,如果HTML标记不是小写的,那么它就不会返回标记的内容。例如: <title>My Title</title> 我的标题 将返回“我的标题”,但 我的标题 或 我的标题 我什么也不回。有没有什么简单的方法可以让它与标签匹配,而不管是哪种情况?我猜这可能涉及正则表达式 下面的代码示例: $nodes = $

我创建了一个简单的PHP脚本,它解析HTML文档并使用getElementByTagName和getAttribute返回元标记。除了一件事之外,它工作得非常好,如果HTML标记不是小写的,那么它就不会返回标记的内容。例如:

<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');
}
$nodes=$doc->getElementsByTagName('title');
$heading=$doc->getElementsByTagName('h1');
$title=$nodes->item(0)->nodeValue;
$h1=$heading->item(0)->nodeValue;
$metas=$doc->getElementsByTagName('meta');
对于($i=0;$i<$metas->length;$i++)
{
$meta=$metas->item($i);
如果($meta->getAttribute('name')=='description')
$description=$meta->getAttribute('content');
如果($meta->getAttribute('name')=='keywords')
$keywords=$meta->getAttribute('content');
如果($meta->getAttribute('name')=='robots')
$robots=$meta->getAttribute('content');
}

根据您使用的是什么,答案是否定的
getElementsByTagName
用于解析XML DOM,XML允许区分大小写的标记名


您可以通过尝试Title、Title、Title等的每个迭代来走超级慢的路线,但是您通常只会看到您提到的三个选项(所有较低、初始大写和所有大写),这使您的工作变得更简单。

XML文档可以有两个不同的元素,分别命名为Title和Title,这两个元素是不同的。将它们转换为相同的名称/将其视为相同的名称是一个可能产生严重后果的错误

不过,在您的情况下,可以使用XSLT将所有大写字符转换为小写字符,如中所述


DOMDocument::loadHtml()将所有元素转换为小写(并删除名称空间)。下面是一个小演示:

$html = <<<'HTML'
<html><Body><Title>My Title</Title></Body></html>
HTML;

$dom = new DOMDocument();
$dom->loadHtml($html);
echo $dom->saveHtml();

在你使用正则表达式之前,你能不能先把html压缩一下?@Enijar:这会改变整个内容,而不仅仅是标记。为什么你会有标记而不是小写?最好只使用小写字母(doctype之类的例外)。
$doc
的值来自哪里?如果构建DOM的任何东西都没有(不区分大小写)HTML选项,我会感到惊讶。@putvande该脚本用于扫描外部站点中的标记。就我个人而言,我总是使用小写,但我的一位同事在使用该工具时遇到一些网站,因为它区分大小写,所以该工具无法在这些网站上运行。XML不仅“允许”区分大小写的标记名,还需要它们。标记名和属性名在XML中始终区分大小写。
$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');
}
<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>
$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>
$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>
$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"