PHP  
downloads | documentation | faq | getting help | | php.net sites | links 
search for in the  
previoussocket_writevAddCSlashesnext
Last updated: Tue, 11 Jun 2002
view this page in Printer friendly version | English | Brazilian Portuguese | Czech | Dutch | Finnish | German | Hungarian | Italian | Japanese | Korean | Polish | Romanian | Russian | Spanish | Turkish

XCVI. Cha�ne de caract�res

Ces fonctions permettent la manipulation de cha�nes de caract�res. Certaines sections plus sp�cialis�es sont disponibles d�s les sections sur les expressions r�guli�res et dans la section URL.

Pour plus de d�tails sur le comportement des cha�nes de caract�res, notamment concernant les guillemets simples ou doubles, et les s�quences d'�chappement, reportez-vous � cha�nes de caract�res, dans le chapitre Types.

Table des mati�res
AddCSlashes --  Ajoute des slash dans une cha�ne, comme en langage C.
AddSlashes --  Ajoute un slash devant tous les caract�res sp�ciaux.
bin2hex --  Convertit une valeur binaire en hexad�cimale
chop --  Enl�ve les espaces de fin de cha�ne.
chr -- Retourne un caract�re.
chunk_split -- Scinde une cha�ne en plus petits morceaux.
convert_cyr_string --  Convertit la cha�ne d'un alphabet cyrillique vers un autre.
count_chars --  Retourne des informations sur les caract�res utilis�s dans une cha�ne.
crc32 -- Calcule le polyn�me crc32 d'une cha�ne
crypt -- Chiffre une cha�ne avec un DES.
echo -- Affiche une ou plusieurs cha�nes.
explode --  Scinde une cha�ne en morceaux, gr�ce � un d�limiteur.
get_html_translation_table --  Retourne la table de traduction HTML
get_meta_tags --  Extrait toutes les balises meta d'un fichier
hebrev --  Convertit un texte h�breux logique en texte visual
hebrevc --  Convertit un texte h�breux logique en texte visuel avec les nouvelles lignes de conversion.
htmlentities --  Convertit tous les caract�res sp�ciaux en entit� HTML.
htmlspecialchars --  Convertit tous les caract�res sp�ciaux en entit� HTML.
implode --  Regroupe tous les �l�ments d'un tableau dans une cha�ne, avec une cha�ne de jointure.
join --  Regroupe tous les �l�ments d'un tableau dans une cha�ne, avec une cha�ne de jointure.
levenshtein --  Calcule la distance Levenshtein entre deux cha�nes
localeconv -- Lit le formatage num�rique et mon�taire
ltrim --  Enl�ve les espaces de d�but de cha�ne.
md5 -- Calcule un md5 avec la cha�ne.
md5_file -- Calculates the md5 hash of a given filename
metaphone -- Calcule la cl� m�taphone d'une cha�ne de caract�res.
nl_langinfo --  Query language and locale information
nl2br -- Ins�re une c�sure HTML avant chaque nouvelle ligne.
ord -- Retourne la valeur ASCII du caract�re.
parse_str --  Analyse une cha�ne, et en d�duit des variables et leur valeur.
print -- Affiche une cha�ne.
printf -- Affiche une cha�ne format�e.
quoted_printable_decode --  D�code une cha�ne
QuoteMeta --  Ajoute un antislash devant tous les caract�res m�ta
rtrim -- Efface les espaces de fin de cha�ne.
setlocale -- Change les informations locales.
similar_text --  Calcule la similarit� de deux cha�nes.
soundex -- Calcule la valeur soundex d'une cha�ne.
sprintf -- Retourne une cha�ne format�e.
sscanf -- Analyse une fonction en fonction d'un format
str_pad -- Compl�te une cha�ne avec une autre
str_repeat -- R�p�te une cha�ne.
str_replace --  Remplace toutes les occurrences d'une cha�ne par une autre.
str_rot13 -- Perform the rot13 transform on a string
strcasecmp --  Compare en binaire des cha�nes, insensible � la casse.
strchr --  Renvoie la cha�ne � partir de la premi�re occurrence
strcmp -- Compare en binaire des cha�nes.
strcoll -- Compare des cha�nes localis�es
strcspn --  Recherche la longueur du premier segment de cha�ne qui ne corresponde pas au masque donn�.
strip_tags -- Enl�ve les balises HTML et PHP.
StripCSlashes --  D�quote une cha�ne quot�e avec addcslashes()
StripSlashes -- Enl�ve les slashs ajout�s par la fonction addslashes()
stristr --  strstr(), insensible � la casse.
strlen -- Retourne la longueur de la cha�ne.
strnatcasecmp --  Compare des cha�nes par ordre "naturel" insensible � la casse
strnatcmp --  Compare des cha�nes par ordre "naturel"
strncasecmp --  Compare en binaire des cha�nes de caract�res
strncmp --  Compare en binaire les premiers caract�res
strpos --  Recherche la premi�re occurrence d'un caract�re dans une cha�ne.
strrchr --  Recherche la partie terminale d'une cha�ne apr�s un caract�re donn�
strrev --  Inverse l'ordre des caract�res d'une cha�ne.
strrpos --  Recherche la derni�re occurrence d'un caract�re dans une cha�ne.
strspn --  Retourne la longueur du premier segment qui v�rifie le masque.
strstr --  Renvoie la cha�ne � partir de la premi�re occurrence
strtok -- Morcelle une cha�ne
strtolower -- Met tous les caract�res en minuscules.
strtoupper -- Met tous les caract�res en majuscules.
strtr --  Remplace toutes les occurrences d'un caract�re par un autre.
substr -- Retourne une partie de la cha�ne.
substr_count -- Compte le nombre de sous-cha�nes
substr_replace -- Remplace dans une sous partie de cha�ne
trim --  Enl�ve les espaces de d�but et de fin de cha�ne
ucfirst --  Force le premier caract�re d'une cha�ne en majuscule.
ucwords --  Force le premier caract�re de chaque mot d'une cha�ne en majuscule
vprintf -- Output a formatted string
vsprintf -- Return a formatted string
wordwrap --  Ajoute une c�sure � une cha�ne tous les n caract�res
User Contributed Notes
Cha�ne de caract�res
add a note about notes

07-Mar-2000 02:24

I had the problem that in some of the guestbooks I programmed, people
entererd trash like 400 characters without spaces and such.  Without any
spaces there was no way to break the lines and the whole guestbooked
looked screwed.  I wrote this little function that makes sure no words are
more than a specified number of characters long.  If a word is too long,
spaces are inserted to get the word to the maximum length allowed. Maybe
it's useful to some of you:

function strmaxwordlen($input,$len) {
 $l = 0;
 $output = "";
 for ($i = 0; $i < strlen($input); $i++) {
  $char = substr($input,$i,1);
  if ($char != " ") { $l++; } else { $l = 0; }
  if ($l == $len) { $l = 0; $output .= " "; }
  $output .= $char;
 }
 return($output);
}


17-Mar-2000 10:56

Regarding MS-Dos style paths, and the escaping problems thereof:  Don't use
backslashes.
Train yourself to use forward slashes. They actually work just as well on Win32, and your code will be quickly portable to UNIX.
"c:/WinNT/System32" is a valid path.
Mind you, I'm not sure what the various web servers will do to these strings...


24-Apr-2000 06:45

For a MySQL problem (where a user might put quotes in a text field from a
form) use addslashes() to escape all quotes (single and double).  For
example:

// Assuming 'textstuff' is from a form
$mytextstuff = addslashes($textstuff);
$sql = "insert into MyTable set MyField='$mytextstuff'";

Also if you are working with html forms and/or text fields from databases
a lot you'll probably want to read up on commands like htmlspecialchars()
as well (a field like "foo<bar>" might not throw MySQL off
but it won't display correctly in an html page).


21-Aug-2000 03:22

// Makes all words starting with  clickable
function urls_clickable($string) {
	for($n=0; $n < strlen($string); $n++)
	{
		if(strtolower($string[$n]) == 'h') {
			if(!strcmp("
strtolower($string[$n]) . strtolower($string[$n+1]) .
strtolower($string[$n+2]) . strtolower($string[$n+3]) . $string[$n+4] .
$string[$n+5] . $string[$n+6])) {
				$startpos = $n;
				while($n < strlen($string) &&
eregi("[a-z0-9\.\:\?\/\~\-\_\&\=\%\+\'\"]",
$string[$n])) $n++;
				if(!eregi("[a-z0-9]", $string[$n-1])) $n--;
				$link = substr($string, $startpos, ($n-$startpos));
				$link = $link;
				$string_tmp = $string;
				$string = substr($string_tmp, 0, $startpos);
				$string .= "<a
href=\"$link\">$link</a>";
				$string .= substr($string_tmp, $n, strlen($string_tmp));
				$n = $n + 15;
			}
		}
	}
	return $string;
}


21-Sep-2000 11:39

In order to properly display text from a form into an html page you need
code
like this:

<? echo htmlentities(stripslashes($form_text)); ?>


13-Nov-2000 06:03

Here is a much better more thought out ucsetence() function. I thought
about it more and it know understands .,?! and all other punctuations and
allows for making any word or character uppercase. Just put words to be
upper case in array $uppercase. Fixes common user email problems like
CAPS, !!!, and i.

Ex:
$paragraph="I Am AN ItiOT!!! I cAN Not TYPe. WHat IS WRONG with ME???
ME (i) do NOT knOW....";

$newParagraph=ucsentence($paragraph);

$newParagraph now is:
I am an itiot! I can not type. What is wrong with me? Me (I) do not know.

function ucsentence($paragraph,$uppercase=0) {
  //default capitol words
  $uppercase[]="I";

  //make sentences from $paragraph
  $paragraph=strtolower(trim($paragraph));

  //replace duplicate chars
  $paragraph=ereg_replace('[ ]+'," ",$paragraph);
  $paragraph=ereg_replace('[.]+',".",$paragraph);
  $paragraph=ereg_replace('[?]+',"?",$paragraph);
  $paragraph=ereg_replace('[!]+',"!",$paragraph);
 
  $words=explode(" ",$paragraph);
  
  FOR ($i=0;$i<count($words);$i++) {
    //fix sentence capitolization
    IF (strstr($words[$i],".")) {
      $words[$i+1]=ucfirst($words[$i+1]);
      }

    IF (strstr($words[$i],"!")) {
      $words[$i+1]=ucfirst($words[$i+1]);
      }

    IF (strstr($words[$i],"?")) {
      $words[$i+1]=ucfirst($words[$i+1]);
      }

    //make array $uppercase uppercase
    IF ($uppercase) {
      IF
(in_array(strtoupper(ereg_replace('[!@#\$%^&*()_+-=,.?\'\";:]',"",$words[$i])),$uppercase))
{
        $words[$i]=strtoupper($words[$i]);
        }
      }
    }

    $new_paragraph=ucfirst(trim(implode(" ",$words)));

  return $new_paragraph;
} //--end ucsentence--


26-Dec-2000 02:20

I wanted to convert numbers to an adjective form (so from "1" to
"1st", from "352" to "352nd", etc.), but
couldn't find it in PHP, so I wrote this little code to do that for me.
Hope you find it useful:

function nth($in) {
  if (!is_long($in))
    return(-1);
  switch ($in) {
    case 0 : return("0th");
    case 1 : return("1st");
    case 2 : return("2nd");
    case 3 : return("3rd");
    case 4 :
    case 5 :
    case 6 :
    case 7 :
    case 8 :
    case 9 :
    case 10 :
    case 11 :
    case 12 :
    case 13 :
    case 14 :
    case 15 :
    case 16 :
    case 17 :
    case 18 :
    case 19 : return($in."th");
  }
  switch (substr($in, -1, 1)) {
    case 0 : return($in."th");
    case 1 : return($in."st");
    case 2 : return($in."nd");
    case 3 : return($in."rd");
    case 4 :
    case 5 :
    case 6 :
    case 7 :
    case 8 :
    case 9 : return($in."th");
    default : return(0);
  }
}

It will return -1 when the input is not an integer and 0 when it couldn't
find a match (although that shouldn't happen).


07-Jan-2001 10:47

Here's some of my code for inserting spaces so people can't screw the page,
I have not tested it, but it's cleaner than other's.

	list ($words) = array (split (" ", $comment));
	$comment = '';
	foreach ($words as $c => $word) {
		if (strlen ($word) > 60 and !ereg ("[\[|\]|\/\/]", $word))
			$word = chunk_split ($word, 60);
		if ($c)
			$comment .= ' ';
		$comment .= $word;
	}

30-Mar-2001 06:05
Here is a very slight fix to this function to make URLs in strings
clickable.  The change allows URLs that have a dash character
"-" to not stop the href tag just before the "-".

The change un-literals the "-" in the eregi function since the
eregi function appears to not want this when you are trying to match an
actual "-".  Seems that different languages have different
requirements about what should be literal.

This:
eregi("[a-z0-9\.\:\?\/\~\-\_\&\=\%\+\'\"]",
$string[$n])

becomes this:
eregi("[a-z0-9\.\:\?\/\~\_\&\=\%\+\'\"-]",
$string[$n])

// Makes all words starting with  clickable 
function urls_clickable($string) { 
for($n=0; $n < strlen($string); $n++) 
{ 
if(strtolower($string[$n]) == 'h') { 
if(!strcmp("
strtolower($string[$n]) . strtolower($string[$n+1]) .
strtolower($string[$n+2]) . strtolower($string[$n+3]) . $string[$n+4] .
$string[$n+5] . $string[$n+6])) { 
$startpos = $n; 
while($n < strlen($string) &&
eregi("[a-z0-9\.\:\?\/\~\_\&\=\%\+\'\"-]",
$string[$n])) $n++; 
if(!eregi("[a-z0-9]", $string[$n-1])) $n--; 
$link = substr($string, $startpos, ($n-$startpos)); 
$link = $link; 
$string_tmp = $string; 
$string = substr($string_tmp, 0, $startpos); 
$string .= "<a href=\"$link\">$link</a>";

$string .= substr($string_tmp, $n, strlen($string_tmp)); 
$n = $n + 15; 
} 
} 
} 
return $string; 
}


04-Apr-2001 02:03

Minor correction to my HTMLEncode function.

function HTMLEncode($text)
{
  $searcharray =  array(
   "'([-_\w\d.]+@[-_\w\d.]+)'",
   "'((?:(?!://).{3}|^.{0,2}))(www\.[-\d\w\.\/]+)'", 
   "'(http[s]?:\/\/[-_~\w\d\.\/]+)'");  
  $replacearray = array(
   "<a href=\">\\1</a>",
   "\\1
   "<a href=\"\\1\">\\1</a>");
  return nl2br(preg_replace($searcharray, $replacearray,
stripslashes($text) ));
}


26-Apr-2001 03:02

To shorten a string to a certain number of characters, replacing surplus
chars with a shortening symbol such as "[...]", use the
following simple function:

========= CUT ==========

function shorten_string($text, $length, $symbol = "[...]")
{
  $length_text = strlen($text);
  $length_symbol = strlen($symbol);

  if($length_text <= $length || $length_text <= $length_symbol ||
$length <= $length_symbol)
    return($text);
  else
    return(substr($text, 0, $length - $length_symbol) . $symbol);
}

========= CUT ==========

The parameter $text ist the string to be shortened. $length is the maximum
number of characters in the new string. $symbol is the shortening symbol
(default is "[...]"). If shortening would make no sense, the
original string is returned.


01-May-2001 06:12

urls_clickable seems to miss the last character from any hyperlink which
ends with a /. This can be a problem for a link to certain web servers
which need a terminating slash to indicate that the last section refers to
a directory.

e.g. 

Here's the altered function:

// Makes all words starting with  clickable 
function urls_clickable($string) {
	for($n=0; $n < strlen($string); $n++) { 
		if(strtolower($string[$n]) == 'h') { 
			if(!strcmp("
strtolower($string[$n]) . strtolower($string[$n+1]) .
strtolower($string[$n+2]) . strtolower($string[$n+3]) . $string[$n+4] .
$string[$n+5] . $string[$n+6])) { 
				$startpos = $n; 
				while($n < strlen($string) &&
eregi("[a-z0-9\.\:\?\/\~\_\&\=\%\+\'\"-]",
$string[$n])) $n++; 
					if(!eregi("[a-z0-9]", $string[$n-1])) $n--; 
					$link = substr($string, $startpos, ($n-$startpos+1)); 
					$link = $link; 
					$string_tmp = $string; 
					$string = substr($string_tmp, 0, $startpos); 
					$string .= "<a
href=\"$link\">$link</a>"; 
					$string .= substr($string_tmp, $n+1, strlen($string_tmp)); 
					$n = $n + 15; 
					} 
			} 
		} 
	return $string; 
}

// lines with a additional +1 are:
// the $link = substr(...
// and
// the $string .= substr(...
// lines


13-Jun-2001 07:31

Browsers (Internet Explorer at least) won't wrap text immediately before
puntuation . ? ! ( ) [ ] { } / even if the preceeding character is
whitespace.  I believe this is intentional widow/orphan prevention
behavior.  This complicates the processing of user-inputed text (e.g. the
message board junk problem).  Even if you use <textarea wrap=hard>
to force newlines into the input text (which is imperfect since a clever
user can just modify the HTML before posting), people posting long strings
of punctuation characters, or just punctuation characters at the beginning
of each line in the <textarea> will mess up the format of the page
for users viewing their post.

You obviously can't solve this by just inserting a spaces - the browser
still won't wrap.  My solution is to use str_replace to put a &nbsp;
(the least visually impacting non-whitespace character I can think of)
between the \n and any pucntuation so the wrap can happen in the
whitespace before the &nbsp;.  Kindof ironic to be using &nbsp; to
*cause* a break:)


15-Jun-2001 09:45

I have written an *evil* little function that will cut a string on a
character given. Features:
1) Minimum length.
2) If a string doesn't contain the character, it cuts your string to
minimum length.
3) If the next character beyond the minimumlength equals the given
character, it will cut the string to minimulength as well.
Code:

<?php
function cuttext($tring,$cuton) {

/* Define the character to cut on */
/* One could make an array with all characters to cut on */
/* But I wouldn't know how to :) */

$space=" ";

if (!strstr($tring,$space)) {

	/* No space is found in the whole string: cut at 20th character */
	
	$tring=substr($tring,0,$cuton);
}
if (substr($tring,$cuton,1)==$space) {

	/* 21st character is a space: cut at 20th character */
	
	$tring=substr($tring,0,$cuton);
} else {

	/* 21st Character is NOT a space: return to last space and cut there */
	
	while ($teller <= $cuton) {
		if (substr($tring,$cuton-$teller,1)==$space) {
			$tring=substr($tring,0,$cuton-$teller);
			break;
		}
		$teller++;
	}
}
return $tring;
}
echo(cuttext("waf groink muha zz gruu wrrreea iii gargghhh
>:)>:)",20));
?>


03-Aug-2001 11:31

there's a problem when i used the addslashes function for my odbc
connection... in order to fix it, I used the htmlspecialchars($str_var,
ENT_QUOTES); instead and it worked fine.  example is as follow:

// $str - a string w/ single quotes
$str = htmlspecialchars($str, ENT_QUOTES);
.
.
.
.
$sql = "<something> $str <something>";
<etc.>


21-Sep-2001 09:52

while we're waiting that ctype functions get out from experimental phase,
look at this function.
It check if a string contain only alphanumeric characters (a-zA-Z0-9)

function isalphanumstr($string) {
          for($i = 0; $i < strlen($string); $i++)
              if (!in_array($string[$i],
array("q","w","e","r","t","y","u","i","o","p","l","k","j","h",
"g","f","d","s","a","z","x","c","v","b","n","m","Q","W",
"E","R","T","Y","U","I","O","P","L","K","J","H","G","F",
"D","S","A","Z","X","C","V","B","N","M","0","1","2","3",
"4","5","6","7","8","9")))
{
                  return false;
              } else {
                  return true;
              }
      }


10-Jan-2002 02:27

I've ported a function to PHP that will find the longest common substring
in two different strings.  Here it is:

function LongestCommonSubstring($string1, $string2)
{
	// find length of longest common substring first
	$L = array();
	$length1 = strlen($string1);
	$length2 = strlen($string2);
		
	for ($i = $length1; $i >= 0; $i--)
	{
		for ($j = $length2; $j >= 0; $j--)
		{
			if ($string1[$i] == '' || $string2[$j] == '') $L[$i][$j] = 0;
			elseif ($string1[$i] == $string2[$j]) $L[$i][$j] =
			       1 + $L[$i + 1][$j + 1];
			else $L[$i][$j] = max($L[$i + 1][$j], $L[$i][$j + 1]);
		}
	}

	// then find the actual substring
	$substring = '';
	$i = 0;
	$j = 0;
    
	while ($i < $length1 && $j < $length2)
	{
		if ($string1[$i] == $string2[$j])
		{
			$substring .= $string1[$i];
			$i++; $j++;
		}
		elseif ($L[$i + 1][$j] >= $L[$i][$j + 1]) $i++;
		else $j++;
	}
	
	return $substring;
}

Here is where I found the original:



20-Feb-2002 07:22

I found a nice replacement vor the "swap" command, which used to
swap two variables...

it even works with more than one element and I used it to change the
bgcolor of a <table> each row (makes reading more comfortable)

first you define $color:
$color= array('#0066CC', '#0099CC');
this piece of code just gives out another color, each time you call it
$tmp = $color[0];
$col = array_shift ($color);
$color[] = $tmp;


11-Apr-2002 07:52

Much faster and much better way to check does string consists
from alphanumeric chars 'only' ...

By the way, author of previous isalphanumstr()
forgot to add whitespace to his array.

It's not an alphanumeric char,
but who would need this function without it ? :)

function isalphanumstr($string) {
    $res=true;
    for($i = 0; $i < strlen($string); $i++)
    if((ord($string[$i])<48 && ord($string[$i])!=32) ||
    (ord($string[$i])>57 && ord($string[$i])<65) ||
    (ord($string[$i])>90 && ord($string[$i])<97) ||
    ord($string[$i])>122) {$res=false; break;}
return $res;
}

echo isalphanumstr(" 1234567890qwertyuiopasdfghjklzxcvbnm
QWERTYUIOPASDFGHJKLZXCVBNM");

//... returns "1" //;)


21-Apr-2002 11:09

This is a more compact function to get a numeric adjective.  No idea if
it's faster than the other "nth" function here (though probably
is, since "th" is more likely to occur), but the code is
definitely shorter.

Assumes integer input.  Returns a string.

function getNth ($n) {
  $qn = (int) (($n%100) / 10);
  $rn = $n % 10;

  $suffix = "th";

  if ($qn != 1) {
    switch ($rn) {
    case 1: $suffix = "st"; break;
    case 2: $suffix = "nd"; break;
    case 3: $suffix = "rd"; break;
    }
  }

  return $n . $suffix;
}


05-Jun-2002 05:20

One could make an ever quicker isalphanumeric() function by using regular
expressions:

function isalphanumeric($test) {
    return !(preg_match("/[^a-z,A-Z,0-9 ]/", $test));
}

Note: that is a space after the 9, in order to inclue spaces in the
comparison.  One could also add \t and \n so that it did not fail out if
it found a tab or newline.  This is much cleaner and more efficient than
the array approach described earlier, and nicer than the ordinal
characters approach as well.


03-Jul-2002 06:14

Earlier I posted a LongestCommonSubstring function.  The function does not
find the long common CONTIGUOUS substring, so I've modified it to do that,
in case anyone needs it:

function LongestCommonContiguousSubstring($string1, $string2)
{
	// find length of longest common substring first
	$L = array();
	$length1 = strlen($string1);
	$length2 = strlen($string2);
		
	for ($i = $length1; $i >= 0; $i--)
	{
		for ($j = $length2; $j >= 0; $j--)
		{
			if ($string1[$i] == '' || $string2[$j] == '') $L[$i][$j] = 0;
			elseif ($string1[$i] == $string2[$j]) $L[$i][$j] = 1 + $L[$i+1][$j+1];
			else $L[$i][$j] = max($L[$i + 1][$j], $L[$i][$j + 1]);
		}
	}

	// then find the actual substring
	$substrings = array();
	$i = 0;
	$j = 0;
	$s = 0;
    
	while ($i < $length1 && $j < $length2)
	{
		if ($string1[$i] == $string2[$j])
		{
			$substrings[$s] .= $string1[$i];
			$i++; $j++;
			continue;
		}
		elseif ($L[$i + 1][$j] >= $L[$i][$j + 1]) $i++;
		else $j++;
		$s++;
	}
	
	$maxlength = 0;
	while (list($key, $val) = each($substrings))
	{
		$length = strlen($val);
		if ($length > $maxlength)
		{
			$maxlength = $length;
			$winner = $key;
		}
	}
	
	return $substrings[$winner];
}

add a note about notes
previoussocket_writevAddCSlashesnext
Last updated: Tue, 11 Jun 2002
show source | credits | stats | mirror sites:  
Copyright © 2001, 2002 The PHP Group
All rights reserved.
This mirror generously provided by:
Last updated: Mon Jul 8 08:17:45 2002 CEST