PHP: DOM Functions - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<scandirDOMAttr->isId>
view the version of this page
Last updated: Tue, 21 Dec 2004

XXVI. DOM Functions

導入

The DOM extension is the replacement for the DOM XML extension from PHP 4. The extension still contains many old functions, but they should no longer be used. In particular, functions that are not object-oriented should be avoided.

The extension allows you to operate on an XML document with the DOM API.

定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

表 1. XML constants

ConstantValueDescription
XML_ELEMENT_NODE (integer) 1Node is an element
XML_ATTRIBUTE_NODE (integer) 2Node is an attribute
XML_TEXT_NODE (integer) 3Node is a piece of text
XML_CDATA_SECTION_NODE (integer) 4 
XML_ENTITY_REF_NODE (integer) 5 
XML_ENTITY_NODE (integer) 6Node is an entity like &nbsp;
XML_PI_NODE (integer) 7Node is a processing instruction
XML_COMMENT_NODE (integer) 8Node is a comment
XML_DOCUMENT_NODE (integer) 9Node is a document
XML_DOCUMENT_TYPE_NODE (integer) 10 
XML_DOCUMENT_FRAG_NODE (integer) 11 
XML_NOTATION_NODE (integer) 12 
XML_HTML_DOCUMENT_NODE (integer) 13 
XML_DTD_NODE (integer) 14 
XML_ELEMENT_DECL_NODE (integer) 15 
XML_ATTRIBUTE_DECL_NODE (integer) 16 
XML_ENTITY_DECL_NODE (integer) 17 
XML_NAMESPACE_DECL_NODE (integer) 18 
XML_ATTRIBUTE_CDATA (integer) 1 
XML_ATTRIBUTE_ID (integer) 2 
XML_ATTRIBUTE_IDREF (integer) 3 
XML_ATTRIBUTE_IDREFS (integer) 4 
XML_ATTRIBUTE_ENTITY (integer) 5 
XML_ATTRIBUTE_NMTOKEN (integer) 7 
XML_ATTRIBUTE_NMTOKENS (integer) 8 
XML_ATTRIBUTE_ENUMERATION (integer) 9 
XML_ATTRIBUTE_NOTATION (integer) 10 

表 2. DOMException constants

ConstantValueDescription
DOM_INDEX_SIZE_ERR (integer) 1 
DOMSTRING_SIZE_ERR (integer) 2 
DOM_HIERARCHY_REQUEST_ERR (integer) 3 
DOM_WRONG_DOCUMENT_ERR (integer) 4 
DOM_INVALID_CHARACTER_ERR (integer) 5 
DOM_NO_DATA_ALLOWED_ERR (integer) 6 
DOM_NO_MODIFICATION_ALLOWED_ERR (integer) 7 
DOM_NOT_FOUND_ERR (integer) 8 
DOM_NOT_SUPPORTED_ERR (integer) 9 
DOM_INUSE_ATTRIBUTE_ERR (integer) 10 
DOM_INVALID_STATE_ERR (integer) 11 
DOM_SYNTAX_ERR (integer) 12 
DOM_INVALID_MODIFICATION_ERR (integer) 13 
DOM_NAMESPACE_ERR (integer) 14 
DOM_INVALID_ACCESS_ERR (integer) 15 
DOM_VALIDATION_ERR (integer) 16 

Classes

The API of the module follows the DOM Level 2 standard as closely as possible. Consequently, the API is fully object-oriented. It is a good idea to have the DOM standard available when using this module.

This module defines a number of classes, which are listed - including their method - in the following tables. Classes with an equivalent in the DOM standard are named DOMxxx.

表 3. List of classes

Class nameParent classes
DOMAttrDOMNode
DOMCDataSectionDOMText
DOMCharacterDataDOMNode
DOMCommentDOMCharacterData
DOMDocumentDOMNode
DOMDocumentFragmentDOMNode
DOMDocumentTypeDOMNode
DOMElementDOMNode
DOMEntityDOMNode
DOMEntityReferenceDOMNode
DOMNode 
DOMNotationDOMNode
DOMProcessingInstructionDOMNode
DOMTextDOMCharacterData
DOMException 
DOMImplementation 
DOMNamedNodeMap 
DOMNodeList 
DOMXPath 

目次
DOMAttr->isId --  Checks if attribute is a defined ID
DOMCharacterData->appendData --  Append the string to the end of the character data of the node
DOMCharacterData->deleteData --  Remove a range of characters from the node
DOMCharacterData->insertData --  Insert a string at the specified 16-bit unit offset
DOMCharacterData->replaceData --  Replace a substring within the DOMCharacterData node
DOMCharacterData->substringData --  Extracts a range of data from the node
DOMDocument->createAttribute -- Create new attribute
DOMDocument->createAttributeNS --  Create new attribute node with an associated namespace
DOMDocument->createCDATASection -- Create new cdata node
DOMDocument->createComment -- Create new comment node
DOMDocument->createDocumentFragment -- Create new document fragment
DOMDocument->createElement -- Create new element node
DOMDocument->createElementNS --  Create new element node with an associated namespace
DOMDocument->createEntityReference -- Create new entity reference node
DOMDocument->createProcessingInstruction -- Creates new PI node
DOMDocument->createTextNode -- Create new text node
DOMDocument->getElementById -- Searches for an element with a certain id
DOMDocument->getElementsByTagName -- Searches for all elements with given tag name
DOMDocument->getElementsByTagNameNS --  Searches for all elements with given tag name in specified namespace
DOMDocument->importNode -- Import node into current document
DOMDocument->load --  Load XML from a file
DOMDocument->loadHTML --  Load HTML from a string
DOMDocument->loadHTMLFile --  Load HTML from a file
DOMDocument->loadXML --  Load XML from a string
DOMDocument->normalize --  Normalizes document
DOMDocument->relaxNGValidate --  Performs relaxNG validation on the document
DOMDocument->relaxNGValidateSource --  Performs relaxNG validation on the document
DOMDocument->save --  Dumps the internal XML tree back into a file
DOMDocument->saveHTML --  Dumps the internal document into a string using HTML formatting
DOMDocument->saveHTMLFile --  Dumps the internal document back into a file using HTML formatting
DOMDocument->saveXML -- Dumps the internal XML tree back into a string
DOMDocument->schemaValidate --  Validates a document based on a schema
DOMDocument->schemaValidateSource --  Validates a document based on a schema
DOMDocument->validate --  Validates the document based on its DTD
DOMDocument->xinclude --  Substitutes XIncludes in a DOMDocument Object
DOMElement->getAttribute -- Returns value of attribute
DOMElement->getAttributeNode -- Returns attribute node
DOMElement->getAttributeNodeNS --  Returns attribute node
DOMElement->getAttributeNS -- Returns value of attribute
DOMElement->getElementsByTagName -- Gets elements by tagname
DOMElement->getElementsByTagNameNS -- Get elements by namespaceURI and localName
DOMElement->hasAttribute -- Checks to see if attribute exists
DOMElement->hasAttributeNS --  Checks to see if attribute exists
DOMElement->removeAttribute -- Removes attribute
DOMElement->removeAttributeNode -- Removes attribute
DOMElement->removeAttributeNS -- Removes attribute
DOMElement->setAttribute -- Adds new attribute
DOMElement->setAttributeNode -- Adds new attribute node to element
DOMElement->setAttributeNodeNS -- Adds new attribute node to element
DOMElement->setAttributeNS -- Adds new attribute
DOMImplementation->createDocument --  Creates a DOM Document object of the specified type with its document element
DOMImplementation->createDocumentType --  Creates an empty DOMDocumentType object
DOMImplementation->hasFeature --  Test if the DOM implementation implements a specific feature and version
DOMNamedNodeMap->getNamedItem --  Retrieves a node specified by name
DOMNamedNodeMap->getNamedItemNS --  Retrieves a node specified by local name and namespace URI
DOMNamedNodeMap->item -- Retrieves a node specified by index
DOMNode->appendChild --  Adds new child at the end of the children
DOMNode->cloneNode --  Clones a node
DOMNode->hasAttributes --  Checks if node has attributes
DOMNode->hasChildNodes --  Checks if node has children
DOMNode->insertBefore --  Adds new child at the end of the children
DOMNode->isSameNode --  Indicates if two nodes are the same node
DOMNode->isSupported --  Checks if feature is supported for specified version
DOMNode->lookupNamespaceURI --  Returns namespace URI of the node based on the prefix
DOMNode->lookupPrefix --  Returns name space prefix of the node based on namespaceURI
DOMNode->normalize --  Normalizes the node
DOMNode->removeChild --  Removes child from list of children
DOMNode->replaceChild --  Replaces a child
DOMNodelist->item --  Retrieves a node specified by index
DOMText->isWhitespaceInElementContent --  Indicates whether this text node contains whitespace
DOMText->splitText --  Breaks this node into two nodes at the specified offset
DOMXPath->query --  Evaluates the XPath expression in the given string
DOMXPath->registerNamespace --  Registers the namespace with the DOMXpath object
dom_import_simplexml --  Get a DOMElement object from a SimpleXMLElement object


add a note add a note User Contributed Notes
DOM Functions
markciliavincenti at NOSPAM dot gmail dot com
25-Feb-2005 11:42
There was a problem with the code I posted in that it didn't allow for empty tags with attributes (eg <img src="test.gif"/>)

Here is the updated code:

<?php

function dom_to_html($domnode) {
  
$temp = '';
  
$domnode = $domnode->firstChild;
   while (!
is_null($domnode)) {
       if (!(
trim($domnode->nodeValue) == "")) {
           switch (
$domnode->nodeType) {

               case
XML_TEXT_NODE: {
                  
$temp .= utf8_decode($domnode->nodeValue);
                   break;
               }
               case
XML_ELEMENT_NODE: {
                  
$tag = $domnode->nodeName;
                  
$temp .= "<" . $tag;
                   if (
$domnode->hasAttributes()) {
                       foreach (
$domnode->attributes as $d_attribute) {
                          
$temp .= ' ' . $d_attribute->name . '="' . utf8_decode($d_attribute->value) . '"';
                       }
                   }
                  
$temp .= ">";
                   break;
               }
           }
           if (
$domnode->hasChildNodes()) {
              
$temp .= dom_to_html($domnode);
              
$temp .= "</" . $tag . ">";
           }
       }
       else {
          
$temp .= "<" . $domnode->nodeName;
           if (
$domnode->hasAttributes()) {
               foreach (
$domnode->attributes as $d_attribute) {
                  
$temp .= ' ' . $d_attribute->name . '="' . utf8_decode($d_attribute->value) . '"';
               }
           }
          
$temp .= "/>";
       }
      
$domnode = $domnode->nextSibling;
   }
   return
$temp;
}

?>
roger4a45 at yahoo dot es
23-Feb-2005 11:35
Output a special chars like &agrave in your XML/XSLT

Following example create a easy XML that is transformed by a xsl i'll show below:

XSL FILE v1.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl=""
xmlns="">
<xsl:template match="TEST">
<xsl:value-of select="NAME"/><BR/>
</xsl:template>
</xsl:stylesheet>

PHP SOURCE CODE

<?php
$xml
= new DOMDocument('1.0', 'utf-8'); //Change encoding to utf-8
$xsl = new DOMDocument;
$xsl->load('v1.xsl');
$proc = new XSLTProcessor;
$root = $xml->CreateElement("TEST");
$val = utf8_encode ('Andr�s Poluk'); //New Line
$child = $xml->CreateElement("NAME",$val);
$root->appendChild($child);
$xml->appendChild($root);
$proc->importStyleSheet($xsl);
echo
$proc->transformToXML($xml);   
?>
rabarca[at]dcc[dot]uchile[dot]cl
13-Jan-2005 02:11
to create a simple array from a plist (
Conceptual/BPRuntimeConfig/Concepts/ConfigFiles.html), you can use this modification from timo[dot]goetze[at]electricpaper[dot]de's function:

<?php
function plist_to_array ($domnode, &$array, $name) {
  
$array_ptr = &$array;
  
$domnode = $domnode->firstChild;
   while (!
is_null($domnode)) {
       if (! (
trim($domnode->nodeValue) == "") ) {
           switch (
$domnode->nodeName)
           {
           case
"dict": {
               if (
$name != "")
                  
$array_ptr = &$array[$name][];
               break;
           }
           case
"key": {
               if (
$domnode->nodeValue != $name)
                  
$name = $domnode->nodeValue;
               break;
           }
           case
"string": {
              
$array_ptr[$name] = $domnode->nodeValue;
               break;
           }
           }
           if (
$domnode->hasChildNodes() ) {
              
plist_to_array ($domnode, $array_ptr, $name);
           }
       }
      
$domnode = $domnode->nextSibling;
   }
}
?>

so far it only works with string types, but you can extend it to the other common data types.
timo[dot]goetze[at]electricpaper[dot]de
12-Dec-2004 12:17
Unfortunately jas at uci dot edu 's function doesn'T really work ;-)

try this corrected version. It works even with complicated HTML..

greetings,

TIMO

<?
function dom_to_simple_array($domnode, &$array) {
 
$array_ptr = &$array;
 
$domnode = $domnode->firstChild;
  while (!
is_null($domnode)) {
   if (! (
trim($domnode->nodeValue) == "") ) {
    
     switch (
$domnode->nodeType) {
        
       case
XML_TEXT_NODE: {
        
$array_ptr['cdata'] = $domnode->nodeValue;

         break;
       }
       case
XML_ELEMENT_NODE: {
        
$array_ptr = &$array[$domnode->nodeName][];
         if (
$domnode->hasAttributes() ) {
                   foreach (
$domnode->attributes as $d_attribute){
                        
$array_ptr[$d_attribute->name] = $d_attribute->value;
                   }
         }
         break;
       }
     }
     if (
$domnode->hasChildNodes() ) {
      
dom_to_simple_array($domnode, $array_ptr);
     }
   }
  
$domnode = $domnode->nextSibling;
  }
}

?>
jas at uci dot edu
06-Dec-2004 03:08
i needed to have an easy way to create a multi-dimensional but EXTREMELY SIMPLE php array out of some XML text i'm receiving. NOT an object. just an ARRAY.

i found that as simple a request as this seemed to be, the new (php5) DOM functions do not provide this functionality.

even the SimpleXML functions are object-oriented, which doesn't work for some of my purposes (sending to a Smarty template variable for looping through, etc.) -- returning attributes as SimpleXMLElement objects instead of strings, etc.. i just wanted an ARRAY containing the data as STRINGS.

eli () had submitted such code earlier, based on domxml/php4 calls. his function was called "domxml_xmlarray".

but when php5 came out, eli's comments at the bottom of the PHP site got erased. (fortunately, i had already saved his code.) no doubt, mine will too w/next version..

furthermore, as far as i can tell, no one has taken the cue to add something like eli's domxml_xmlarray function directly into the DOMDocument object (but it would be nice).

so i translated eli's code, now using the dom calls (instead of the older domxml calls), and renamed the function to "dom_to_simple_array()".

below is a script containing the function itself as well as an example of its use. just copy it to your server somewhere and execute it and it should work right off the bat if you are using php5.

thanks.
jeff stern
 
==================================================================
<?php

function dom_to_simple_array($domnode, &$array) {
 
$array_ptr = &$array;
 
$domnode = $domnode->firstChild;
  while (!
is_null($domnode)) {
   if (! (
trim($domnode->nodeValue) == "") ) {
     switch (
$domnode->nodeType) {
       case
XML_TEXT_NODE: {
        
$array_ptr['cdata'] = $domnode->nodeValue;
         break;
       }
       case
XML_ELEMENT_NODE: {
        
$array_ptr = &$array[$domnode->nodeName][];
         if (
$domnode->hasAttributes() ) {
          
$attributes = $domnode->attributes ();
           if (!
is_array ($attributes)) {
             break;
           }
           foreach (
$attributes as $index => $domobj) {
            
$array_ptr[$index] = $array_ptr[$domobj->name] = $domobj->value;
           }
         }
         break;
       }
     }
     if (
$domnode->hasChildNodes() ) {
      
dom_to_simple_array($domnode, $array_ptr);
     }
   }
  
$domnode = $domnode->nextSibling;
  }
}

 
# now, let's make a sample string containing some XML
 
$strXMLData = "<contacts>
       <contact>
         <name>
           John Doe
         </name>
         <phone>
           123-456-7890
         </phone>
       </contact>
       <contact>
         <name>
           Mary Smiley
         </name>
         <phone>
           567-890-1234
         </phone>
       </contact>
     </contacts>"
;

 
# create a DOM tree xml object (hierarchical array) from
  # this XML string
 
$domdoc = new DOMDocument;
 
$domdoc->loadXML($strXMLData);

 
# now simplify the DOM array into a very simple array structure

  # first, create an empty array to be filled with your
  # simplified array result..
 
$aData = array();

 
# now, pass the dom document and your empty array to the
  # converter function.
 
dom_to_simple_array($domdoc, $aData);

 
# now $aData contains your simplified array, so print it out
?><html>
<body>
<p>there are <? echo count($aData['contacts'][0]['contact']); ?>
contacts</p>
<p>the 2nd contact's phone number is
<?echo $aData['contacts'][0]['contact'][1]['phone'][0]['cdata']; ?>
</p>
<hr />
<p>Here is the raw array structure:</p>
<pre>
<? print_r($aData); ?>
</pre>
</body>
</html>
M. Gutbrod
27-Nov-2004 11:12
If you have two nodes in a HTML DOM and you want to get all text nodes between them, you can do someting like this:

<?php
// Start node; e.g.:
$n=$dom->lastChild->previousSibling->firstChild->nextSibling;

// End node, e.g:
$e=$dom->lastChild;

while (
true) {
 if (
$n->nodeType===XML_TEXT_NODE) {      //  Add " && !$up" if it's not XML_TEXT_NODE
 
echo $n->nodeValue;}
 if (
$n->isSameNode($e)) {
  break;}
 if ((
$n->firstChild !== NULL) && !$up) {
 
$n=$n->firstChild;}
 elseif (
$n->nextSibling !== NULL) {
 
$up=false;
 
$n=$n->nextSibling;}
 elseif (
$n->parentNode !== NULL) {
 
$up=true;
 
$n=$n->parentNode;}
 else {
  break;}}
?>
oliver dot christen at camptocamp dot com
19-Nov-2004 04:20
simple exemple of how to get the value of an attribute, delete that attribute and create a new element at the place we want with the value of the attribute

<?xml version="1.0"?>

<book type="paperback">
   <title name='MAP'>Red Nails</title>
   <price>$12.99</price>
   <author>
       <name first="Robert" middle="E" last="Howard"/>
       <birthdate>9/21/1977</birthdate>
   </author>
</book>

<?php

//filename xml file to use
$file = 'book.xml';

$doc = new domDocument;

if (
file_exists($file)) {
  
$doc->load($file);
} else {
   exit(
'Erreur !.');
}

$xpath = new domXPath($doc);

$query = "//author/*";
$xpathQuery = $xpath->query($query);

// a for loop to iterate all the elements in the xpathQuery nodelist and allow us to find what we want
// i could have used a while loop also, use what you prefer
$size = $xpathQuery->length;
for (
$i=0; $i<$size; $i++){
  
$node = $xpathQuery->item($i);
   if (
$node->nodeName == 'name' && $node->hasAttributes()){

       foreach (
$node->attributes as $attribute) {
           if (
$attribute->name == 'last' && $attribute->value == 'Howard'){
               foreach (
$node->attributes as $attribute) {
                   if (
$attribute->name == 'first'){
                      
// get first name value
                      
$firstname = $attribute->value;
                      
// we need the current node later so we know where to add the new element
                      
$refnode = $node;
                      
// remove the firstname attribut
                      
$node->removeAttribute('first');
                   }
               }
           }
       }
   }
}
if (isset(
$refnode)) {
  
// we need the parent node (see below)
  
$parentnode = $refnode->parentNode;
  
// creat new element firstname
  
$newnode = $doc->createElement('firstname', $firstname);
  
// optional, creat a linebreak element
  
$newtextnode = $doc->createTextNode(chr(10));
  
// insert the new element before the reference node (in this case, the 'name' node)
  
$newnode = $parentnode->insertBefore($newnode, $refnode);
  
// optional, insert the linebreak before the reference node, hence after the new 'firstname' element
  
$newtextnode = $parentnode->insertBefore($newtextnode, $refnode);
}

print
$doc->saveXML();

?>
checksum at checksum.net.nz
03-Nov-2004 02:36
An excellent way to get a nodes elements in php5:
( remembering to use item(n) if more than one node exists )
 
one node:
$node = $dom->getElementsByTagname("node");
   foreach( $node->item(0)->attributes as $items){
   print "$items->nodeName: $items->nodeValue";
   }

If you wanted to search a list of the same nodes:

n nodes:
foreach(  $dom->getElementsByTagname("node") as $item ) {
   foreach( $item->attributes as $attrib ){
   print "$attrib->nodeName: $attrib->nodeValue";
   }
}
franp at free dot fr
02-Nov-2004 10:23
Since there is a complete interoperability between a DOM object and the corresponding SimpleXML object, you may be tempted to interchange both in order to get the best of the two worlds to achieve a given task.

If so, be aware that syntax of DOM and SimpleXML are, unfortunatly, not interoperable in most cases.

Consider for example the syntax to return a nodelist in both DOM and SimpleXML (in the following example the root tag is supposed to be "<racine>"):

<?php

// DOM object method is "childNodes"

$doc = new DomDocument;
$doc->loadXML($str);
foreach (
$doc->documentElement->childNodes as $child)
           {
// do something }

// while SimpleXML method is "children()"

$sxml = simplexml_import_dom($doc);
foreach (
$sxml->racine->children() as $child)
           {
// do something }

?>

Nota :  There is certainly some reason the php5 team chose to not unify DOM and SimpleXML and I am not able, technicaly, to discuss that choice. It would just be nice if a comparative table of syntaxes/methodes in DOM and SimpleXML was made available somewhere. Even if not comparative, simply a table of all available methods in the DOM API and SimpleXML API would be of great help.
SG_01 Lunarchild
28-Sep-2004 04:03
Re: dn at NOSPAM dot xbe dot ch

- there seems to be no easy way get an array of all available attributes of a given node/element. i didn't find it here nor in the w3c dom2 specification.

---------------------

Here's a function that might help ya:

<?php

function GetElementArray($Node) {
 
$arrOut = Array();
 
$cNode = $Node->firstChild;
  while (
$cNode->nextSibling != NULL) {
  
$arrOut[] = $cNode;
  
$cNode = $cNode->nextSibling;
  }
  return
$arrOut;
}

?>

Also you might try using an xpath query and getting a nodelist which basicaly is an array ;)
jw at jwscripts dot com
17-Sep-2004 04:21
The following shows how to add a DTD to an XML document:

<?php

// Create an instance of the DomImplementation class
$impl = new DomImplementation;

// Create an instance of the DomDocumentType class by
// calling the DomImplementation::createDocumentType() method
// (arguments: doctype_name, doctype_public, doctype_system)
$dtd = $impl->createDocumentType("graph", "", "graph.dtd");

// Create an instance of the DomDocument class by
// calling the DomImplementation::createDocument() method
// (arguments: NS_URL, NS_PREFIX, DomDocumentType_instance)
$dom = $impl->createDocument("", "", $dtd);

// Set other properties
$dom->encoding = "UTF-8";
$dom->standalone = "no";

// Create an empty element
$element = $dom->createElement("graph");

// Append the element
$dom->appendChild($element);

// Retrieve and print the document
print $dom->saveXML());

/*
 Result:
 =========
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE graph SYSTEM "graph.dtd">
 <graph/>
*/

?>
dave at guidedvision dot com
31-Aug-2004 04:17
To load external entities from a doctype declaration set the member resolveExternals to true. This is useful for including character entities in your custom xml documents.

For example:
<?php
$xml
= <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page SYSTEM "">
<page>&nbsp; &oelig; &eacute;</page>
XML;                                                                                                                           
$dom = new domDocument();
$dom->resolveExternals = true;
$dom->loadXML($xml);
echo
$dom->saveXML();                                                                                                                         
?>

Without setting resolveExternals to true the "&nbsp; &oelig; &eacute;" are lost.

<scandirDOMAttr->isId>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page