Fix the Alexander Peev's parsing functions.
<?php
$cfg[csvEnc] = '"';
$cfg[csvEsc] = '\\';
$cfg[csvTerm] = ",";
if( !function_exists("parse_csv_aux") ){
function parse_csv_aux( $string ){
global $cfg;
$product = "";
$in_quote = FALSE;
$skipped_quote = FALSE;
for($i = 0 ; $i < strlen($string) ; $i++){
if( $string{$i} == $cfg[csvEnc] ){
if($in_quote){
if($skipped_quote){
$product .= $cfg[csvEnc];
$skipped_quote = FALSE;
}
else if( !$skipped_quote ){
$skipped_quote = TRUE;
}
$in_quote = FALSE;
}
else{
if($skipped_quote) $skipped_quote = FALSE;
$in_quote = TRUE;
}
}
else if( $string{$i} == "," ){
if($in_quote){
$product .= ",";
}
else{
$product .= " ~ ";
}
}
else{
if($in_quote){
//$in_quote = FALSE;
$product .= $string{$i};
}
else{
$product .= $string{$i};
}
}
}
return $product;
}
}
if( !function_exists("parse_csv") ){
function parse_csv($string){
global $cfg;
$data = array();
if( is_string($string) && ( stripos($string, "\n") !== FALSE ) ){
$data = explode("\n", parse_csv_aux($string) );
foreach($data as $key => $row){
$columns = array();
//$row = strtr( $row, array( "\";\"" => "\";\"", ";" => " ; " ) );
if( stripos($row, " ~ ") !== FALSE ){
$columns = explode( " ~ ", $row );
if( !is_array($columns) )$columns = array( strval($columns) );
$data[$key] = $columns;
}
}
return $data;
}
else if( is_string($string) && ( stripos( ($string = parse_csv_aux($string)), " ~ ") !== FALSE ) ){
$columns = explode( " ~ ", $string );
if( !is_array($columns) )$columns = array( strval($columns) );
return array($columns);
}
else return strval($string);
} /* end function parse_csv */
} /* end not function exists parse_csv */
if( !function_exists("store_csv_aux") ){
function store_csv_aux( $string ){
global $cfg;
$string = strtr( $string, array( "\n" => "" ) );
$product = "";
$in_quote = FALSE;
for( $i = 0 ; $i < strlen($string) ; $i++ ){
if( $string{$i} == $cfg[csvEnc] ){
if($in_quote){
$product .= "\"{$cfg[csvEnc]}";
}
else{
$product .= "\"\"{$cfg[csvEnc]}";
$in_quote = TRUE;
}
}
else if( $string{$i} == "," ){
if($in_quote){
$product .= ",";
}
else{
$product .= "\",";
$in_quote = TRUE;
}
}
else{
if($in_quote){
$product .= $cfg[csvEnc];
$in_quote = FALSE;
$product .= $string{$i};
}
else{
$product .= $string{$i};
}
}
}
if($in_quote)$product .= $cfg[csvEnc];
return $product;
}
}
if( !function_exists("store_csv") ){
function store_csv($data){
global $cfg;
if(!is_array($data))return strval($data);
$passed_rows = FALSE;
$product = "";
foreach($data as $row){
if( $passed_rows )$product .= "\n";
if( is_array($row) ){
$columns = "";
$passed_cols = FALSE;
foreach($row as $column){
if( $passed_cols )$columns .= ",";
$columns .= store_csv_aux( $column );
$passed_cols =TRUE;
}
$product .= strval($columns);
}
else{
$product .= strtr( strval($row), array("\n" => "") );
}
$passed_rows = TRUE;
}
return $product;
} /* end function store_csv */
} /* end not function exists store_csv */
?>
substr
(PHP 4, PHP 5)
substr — Return part of a string
说明
Returns the portion of string specified by the start and length parameters.
参数
- string
-
The input string.
- start
-
If start is non-negative, the returned string will start at the start 'th position in string , counting from zero. For instance, in the string 'abcdef', the character at position 0 is 'a', the character at position 2 is 'c', and so forth.
If start is negative, the returned string will start at the start 'th character from the end of string .
Example#1 Using a negative start
<?php
$rest = substr("abcdef", -1); // returns "f"
$rest = substr("abcdef", -2); // returns "ef"
$rest = substr("abcdef", -3, 1); // returns "d"
?> - length
-
If length is given and is positive, the string returned will contain at most length characters beginning from start (depending on the length of string ). If string is less than or equal to start characters long, FALSE will be returned.
If length is given and is negative, then that many characters will be omitted from the end of string (after the start position has been calculated when a start is negative). If start denotes a position beyond this truncation, an empty string will be returned.
Example#2 Using a negative length
<?php
$rest = substr("abcdef", 0, -1); // returns "abcde"
$rest = substr("abcdef", 2, -1); // returns "cde"
$rest = substr("abcdef", 4, -4); // returns ""
$rest = substr("abcdef", -3, -1); // returns "de"
?>
返回值
Returns the extracted part of string.
范例
Example#3 Basic substr() usage
<?php
echo substr('abcdef', 1); // bcdef
echo substr('abcdef', 1, 3); // bcd
echo substr('abcdef', 0, 4); // abcd
echo substr('abcdef', 0, 8); // abcdef
echo substr('abcdef', -1, 1); // f
// Accessing single characters in a string
// can also be achived using "curly braces"
$string = 'abcdef';
echo $string{0}; // a
echo $string{3}; // d
echo $string{strlen($string)-1}; // f
?>
substr
31-Oct-2008 05:00
30-Oct-2008 08:52
hi, really basic function to take blob with full http url's and turn then into "more info" links, handy for page layout etc ;)
<?php
function urltolink($data){
while (strpos($wdata, "http")) {
$op=strpos($wdata, "http");
$rdata=substr($wdata, 0, $op);
$ndata=substr($wdata, $op, strlen($wdata)-$op);
$cp=strpos($ndata, "\n");
$link=substr($ndata, 0, $cp);
$oc=$op+$cp;
$wdata=substr($wdata, $oc, strlen($wdata)-$oc);
$edata=$edata."$rdata <a href=\"$link\">more info</a><br />";
}
return $edata;
}
?>
24-Oct-2008 05:31
Here we have gr8 function which simply convert ip address to a number using substr with negative offset.
You can need it if you want to compare some IP addresses converted to a numbers.
For example when using ip2country, or eliminating same range of ip addresses from your website :D
<?php
function ip2no($val)
{
list($A,$B,$C,$D) = explode(".",$val);
return
substr("000".$A,-3).
substr("000".$B,-3).
substr("000".$C,-3).
substr("000".$D,-3);
}
$min = ip2no("10.11.1.0");
$max = ip2no("111.11.1.0");
$visitor = ip2no("105.1.20.200");
if($min<$visitor && $visitor<$max)
{ echo 'Welcome !'; }
else
{ echo 'Get out of here !'; }
?>
29-Sep-2008 01:01
Simple use of substr to determine possession:
<?php
function possessive ($word) {
return $word.(substr($word, -1) == 's' ? "'" : "'s");
}
// Davis => Davis'
// Paul => Paul's
?>
19-Sep-2008 06:21
<?php
function insert_substr($str, $pos, $substr) {
$part1 = substr($str, 0, -$pos);
$part2 = substr($str, -$pos);
return $part1.$substr.$part2;
}
?>
29-Aug-2008 03:57
***Caution newbie***
To extract a file Extension this fuction could be useful.
$file_extension = substr($filename , strrpos($filename , '. ') +1);
Suppose your file name is Baldaris.jpeg
strrpos will return the last dot position in the string 9 so
so the compiler will execute substr($filename , 10)
$file_extension will have value jpeg
pretty cool...
Cheer's
Baldaris
18-Aug-2008 11:33
The documentation no longer states what happens when length is omitted. It should state that in this case, the function returns whatever would have been returned if a length equal to the remaining length of the source string was supplied.
05-Aug-2008 10:59
Just a little function to cut a string by the wanted amount. Works in both directions.
<?php
function cutString($str, $amount = 1, $dir = "right")
{
if(($n = strlen($str)) > 0)
{
if($dir == "right")
{
$start = 0;
$end = $n-$amount;
} elseif( $dir == "left") {
$start = $amount;
$end = $n;
}
return substr($str, $start, $end);
} else return false;
}
?>
Enjoy ;)
31-Jul-2008 05:17
Here is a quick function to get the substring of a string up to and including the last occurrence of $needle
<?php
function substrtruncate($string, $needle)
{
return substr($string, 0, strrpos($string, $needle)+1);
}
$current_dir = substrtruncate($_SERVER['SCRIPT_NAME'], '/');
?>
29-Jul-2008 02:18
I wrote this simple function
<?php
$input = "hello world"
echo(limitchrmid($imput,10)) // hel ... rld
//limit chars middle
function limitchrmid($value,$lenght){
if (strlen($value) >= $lenght ){
$lenght_max = ($lenght/2)-3;
$start = strlen($value)- $lenght_max;
$limited = substr($value,0,$lenght_max);
$limited.= " ... ";
$limited.= substr($value,$start,$lenght_max);
}
else{
$limited = $value;
}
return $limited;
}
?>
27-Jun-2008 04:09
joao dot martins at plako dot net
26-Mar-2008 09:14
ben at enemy dot dk
10-Feb-2008 05:48
Updated function. The previous one will return empty value if the $string has no letter spaces. This is usefull if some of your strings have only one word.
function cutText($string, $setlength) {
$length = $setlength;
if($length<strlen($string)){
while (($string{$length} != " ") AND ($length > 0)) {
$length--;
}
if ($length == 0) return substr($string, 0, $setlength);
else return substr($string, 0, $length);
}else return $string;
}
03-Jun-2008 06:13
easy and quick way to limit length of a text by not cutting full words:
textLimit('some words', 7) is 'some...'
function textLimit($string, $length, $replacer = '...')
{
if(strlen($string) > $length)
return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;
return $string;
}
16-May-2008 01:54
In response to: "dev at arthurk dot com"
Your code:
<?php
$file_basename = substr($filename, 0, strripos($filename, '.')); // strip extention
$file_ext = substr($filename, -1 * strripos($filename, '.'));
?>
The second line don't work.
This code work fine:
<?php
$file_basename = substr($filename, 0, strripos($filename, '.')); // strip extention
$file_ext = substr($filename, strripos($filename, '.'));
?>
Example:
$filename="anything.jpg"
strripos($filename, '.'); -> position 8
substr($filename, -1 * 8); -> "hing.jpg" (-8 chars from end)
But:
substr($filename, 8); -> ".jpg" (starts in the char number 8)
Sorry for my english, and, "dev at arthurk dot com", sorry, i don't disturb you, only want contribute.
Open Source is revolution!!! -;)
02-Apr-2008 02:34
Here is a quick and easy way to get the base name and the extension of a file. It also handles filenames like foo-1.0.1.tar (where foo-1.0.1 is the base, and .tar is the extension).
<?php
$file_basename = substr($filename, 0, strripos($filename, '.')); // strip extention
$file_ext = substr($filename, -1 * strripos($filename, '.'));
?>
Notice the use of "strripos()" instead of "stripos()".
If you need to detect .tar.gz, etc. as the ext (starting at the first dot), substitute "stripos" for "strripos".
26-Mar-2008 09:14
ben at enemy dot dk
10-Feb-2008 05:48
The function he wrote to cut text whithout cutting in middle of words, doesn't work if $lenght is smaller than $string size..
Just add a simple test and it works perfect for listing texts with a maximum chars:
function cutText($string, $length) {
if($length<strlen($string)){
while ($string{$length} != " ") {
$length--;
}
return substr($string, 0, $length);
}else return $string;
}
17-Mar-2008 07:53
Split a string to an array of strings specified by an array of lengths:
<?php
function split_by_lengths($inString, $arrayLengths)
{
$output = array();
foreach ($arrayLengths as $oneLength)
{
$output[] = substr($inString, 0, $oneLength);
$inString = substr($inString, $oneLength);
}
return ($output);
}
?>
split_by_lengths('teststringtestteststring', array(4,6,4,4,6)) returns:
array('test','string','test','test','string')
Don't use it on user input without some error handling!
09-Mar-2008 01:59
kriskra's charAt script has the nifty feature that when $pos == -1, it will give the last letter of the string.
I am not sure (did not test), but I believe this code might be slightly faster:
<?php
/**
* Function to get a single character from a string
*
* @param string $str String to get char from
* @param integer $pos Get char from this position of $str. Should be zero or greater
* @return mixed Integer -1 when $pos is out of range, otherwise the charater at position $pos.
*/
function charAt($str, $pos) {
return ($pos < 0 || $pos >= strlen($str)) ? -1 : $str{$pos};
}
?>
Please note that this version does NOT have this nifty feature.
When $pos == -1, result will be -1.
29-Feb-2008 08:21
The javascript charAt equivalent in php of felipe has a little bug. It's necessary to compare the type (implicit) aswell or the function returns a wrong result:
<?php
function charAt($str,$pos) {
return (substr($str,$pos,1) !== false) ? substr($str,$pos,1) : -1;
}
?>
22-Feb-2008 08:12
I've used the between, after, before, etc functions that biohazard put together for years and they work great. I've also added to it a new function that I use a lot and thought others might like it as well. It uses his before/after functions so they are required to use it.
<?
$example_html = "<p>test1 Test2</p><title>hi there</title><p>Testing</p>";
$paragraph_text = multi_between('<p>', '</p>', $example_html);
//Prints an arry of:
//Array ( [1] => test1 Test2 [2] => Testing )
print_r($paragraph_text);
function multi_between($this, $that, $inthat)
{
$counter = 0;
while ($inthat)
{
$counter++;
$elements[$counter] = before($that, $inthat);
$elements[$counter] = after($this, $elements[$counter]);
$inthat = after($that, $inthat);
}
return $elements;
}
//Get the help functions from biohazard's post below.
?>
10-Feb-2008 11:48
Needed a method to cut text without cutting in middle of words, so made this little function to iterate back until a whitespace is found, and then cut the text from there.
function cutText($string, $length) {
while ($string{$length} != " ") {
$length--;
}
return substr($string, 0, $length);
}
05-Jan-2008 11:47
Because i didnt see a function that would cut a phrase from a text (article or whatever) no matter where, front/middle/end and add ... + keeping the words intact, i wrote this:
Usage:
- The parameter $value if array will need the whole text and the portion you want to start from, a string. EG: cuttext(array($text, $string), 20). If the string is "have" and is near the beginning of the text, the function will cut like "I have a car ...", if the string is in the middle somewhere it will cut like "... if you want to have your own car ..." and if its somewhere near the end it will cut like "... and you will have one."
- The $length parameter is self explanatory.
Note: if you have just a string "127hh43h2h52312453jfks2" and you want to cut it, just use the function like so: cuttext($string, 10) and it will cut it like "127hh43h2h..."
<?php
////////////////////////////////////////////////////////
// Function: cuttext
// Description: Cuts a string and adds ...
function cuttext($value, $length)
{
if(is_array($value)) list($string, $match_to) = $value;
else { $string = $value; $match_to = $value{0}; }
$match_start = stristr($string, $match_to);
$match_compute = strlen($string) - strlen($match_start);
if (strlen($string) > $length)
{
if ($match_compute < ($length - strlen($match_to)))
{
$pre_string = substr($string, 0, $length);
$pos_end = strrpos($pre_string, " ");
if($pos_end === false) $string = $pre_string."...";
else $string = substr($pre_string, 0, $pos_end)."...";
}
else if ($match_compute > (strlen($string) - ($length - strlen($match_to))))
{
$pre_string = substr($string, (strlen($string) - ($length - strlen($match_to))));
$pos_start = strpos($pre_string, " ");
$string = "...".substr($pre_string, $pos_start);
if($pos_start === false) $string = "...".$pre_string;
else $string = "...".substr($pre_string, $pos_start);
}
else
{
$pre_string = substr($string, ($match_compute - round(($length / 3))), $length);
$pos_start = strpos($pre_string, " "); $pos_end = strrpos($pre_string, " ");
$string = "...".substr($pre_string, $pos_start, $pos_end)."...";
if($pos_start === false && $pos_end === false) $string = "...".$pre_string."...";
else $string = "...".substr($pre_string, $pos_start, $pos_end)."...";
}
$match_start = stristr($string, $match_to);
$match_compute = strlen($string) - strlen($match_start);
}
return $string;
}
?>
10-Oct-2007 06:03
Just want to note that if you are retrieving sub-strings of length zero, this function breaks in the base case (the source being an empty string):
substr('123',0,0) returns string(0) ""
substr('12',0,0) returns string(0) ""
substr('1',0,0) returns string(0) ""
but
substr('',0,0) returns bool(false)
Although this is the documented behavior, I would consider it unexpected in many circumstances.
24-Sep-2007 01:55
Adding the $limit parameter introduced a bug that was not present in the original. If $limit is small or negative, a string with a length exceeding the limit can be returned. The $limit parameter should be checked. It takes slightly more processing, but it is dwarfed in comparison to the use of strlen().
<?php
function short_name($str, $limit)
{
// Make sure a small or negative limit doesn't cause a negative length for substr().
if ($limit < 3)
{
$limit = 3;
}
// Now truncate the string if it is over the limit.
if (strlen($str) > $limit)
{
return substr($str, 0, $limit - 3) . '...';
}
else
{
return $str;
}
}
?>
12-Sep-2007 07:06
I prefer
<?php
function short_name($str, $limit)
{
return strlen($str) > $limit ? substr($str, 0, $limit - 3) . '...' : $str;
}
?>
Now, every returned string has a maximum length of $limit chars (instead of $limit + 3).
31-Aug-2007 06:56
I wanted to work out the fastest way to get the first few characters from a string, so I ran the following experiment to compare substr, direct string access and strstr:
<?php
/* substr access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
$opening = substr($string,0,11);
if ($opening == 'Lorem ipsum'){
true;
}else{
false;
}
}
$endtime1 = endTimer();
/* direct access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
if ($string[0] == 'L' && $string[1] == 'o' && $string[2] == 'r' && $string[3] == 'e' && $string[4] == 'm' && $string[5] == ' ' && $string[6] == 'i' && $string[7] == 'p' && $string[8] == 's' && $string[9] == 'u' && $string[10] == 'm'){
true;
}else{
false;
}
}
$endtime2 = endTimer();
/* strstr access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
$opening = strstr($string,'Lorem ipsum');
if ($opening == true){
true;
}else{
false;
}
}
$endtime3 = endTimer();
echo $endtime1."\r\n".$endtime2."\r\n".$endtime3;
?>
The string was 6 paragraphs of Lorem Ipsum, and I was trying match the first two words. The experiment was run 3 times and averaged. The results were:
(substr) 3.24
(direct access) 11.49
(strstr) 4.96
(With standard deviations 0.01, 0.02 and 0.04)
THEREFORE substr is the fastest of the three methods for getting the first few letters of a string.
30-Jul-2007 06:06
If you need to divide a large string (binary data for example) into segments, a much quicker way to do it is to use streams and the php://memory stream wrapper.
For example, if you have a large string in memory, write it to a memory stream like
<?php
$segment_length = 8192; // this is how long our peice will be
$fp = fopen("php://memory", 'r+'); // create a handle to a memory stream resource
fputs($fp, $payload); // write data to the stream
$total_length=ftell($fp); // get the length of the stream
$payload_chunk = fread ( $fp, $segment_length );
?>
Working with large data sets, mine was 21MB, increased the speed several factors.
26-Jun-2007 05:40
All the references to "curly braces" on this page appear to be obsolete.
According to http://us.php.net/manual/en/language.types.string.php
"Using square array-brackets is preferred because the {braces} style is deprecated as of PHP 6."
Robert Chapin
Chapin Information Services
26-Jun-2007 06:31
Starting from version 5.2.3 if $start is negative and larger then the length of the string, the result is an empty string, while in earlier versions the result was the string itself!
substr ("abcdef", -1000);
result in 5.2.0
'abcdef'
result in 5.2.3
''
This is a small inconsistency, one of those things that makes the life of a PHP programmer like hell.
10-May-2007 12:08
The functions submitted below are a waste of time and memory. To convert a string to an integer or a trimmed float, use the built in conversion instead of parsing the string, e.g :
<?php
$x = "27.2400";
echo (float)$x; // 27.24
echo (int)$x; // 27
?>
06-Mar-2007 04:51
A further addition to Jean-Felix function to extract data between delimeters.
The previous function wouldn't return the correct data if the delimeters used where long than one char. Instead the following function should do the job.
<?php
function extractBetweenDelimeters($inputstr,$delimeterLeft,$delimeterRight) {
$posLeft = stripos($inputstr,$delimeterLeft)+strlen($delimeterLeft);
$posRight = stripos($inputstr,$delimeterRight,$posLeft+1);
return substr($inputstr,$posLeft,$posRight-$posLeft);
}
?>
28-Feb-2007 10:10
If you need to extract information in a string between delimeters then you can use this:
Inputstring is:
"Heidi Klum Supermodel" <info@HeidiKlum.com>
Here the script
<?php
$emailadresse = "\"Heidi Klum Supermodel\" <info@HeidiKlum.com>";
$outputvalue = extractBetweenDelimeters($emailadresse,"\"","\"");
echo $outputvalue; // shows Heidi Klum Supermodel
echo "<br>";
$outputvalue = extractBetweenDelimeters($emailadresse,"<",">");
echo $outputvalue; // shows info@HeidiKlum.com
function extractBetweenDelimeters($inputstr,$delimeterLeft,$delimeterRight) {
$posLeft = stripos($inputstr,$delimeterLeft)+1;
$posRight = stripos($inputstr,$delimeterRight,$posLeft+1);
return substr($inputstr,$posLeft,$posRight-$posLeft);
}
?>
14-Feb-2007 05:20
/*
An advanced substr but without breaking words in the middle.
Comes in 3 flavours, one gets up to length chars as a maximum, the other with length chars as a minimum up to the next word, and the other considers removing final dots, commas and etcteteras for the sake of beauty (hahaha).
This functions were posted by me some years ago, in the middle of the ages I had to use them in some corporations incorporated, with the luck to find them in some php not up to date mirrors. These mirrors are rarely being more not up to date till the end of the world... Well, may be am I the only person that finds usef not t bre word in th middl?
Than! (ks)
This is the calling syntax:
snippet(phrase,[max length],[phrase tail])
snippetgreedy(phrase,[max length before next space],[phrase tail])
*/
function snippet($text,$length=64,$tail="...") {
$text = trim($text);
$txtl = strlen($text);
if($txtl > $length) {
for($i=1;$text[$length-$i]!=" ";$i++) {
if($i == $length) {
return substr($text,0,$length) . $tail;
}
}
$text = substr($text,0,$length-$i+1) . $tail;
}
return $text;
}
// It behaves greedy, gets length characters ore goes for more
function snippetgreedy($text,$length=64,$tail="...") {
$text = trim($text);
if(strlen($text) > $length) {
for($i=0;$text[$length+$i]!=" ";$i++) {
if(!$text[$length+$i]) {
return $text;
}
}
$text = substr($text,0,$length+$i) . $tail;
}
return $text;
}
// The same as the snippet but removing latest low punctuation chars,
// if they exist (dots and commas). It performs a later suffixal trim of spaces
function snippetwop($text,$length=64,$tail="...") {
$text = trim($text);
$txtl = strlen($text);
if($txtl > $length) {
for($i=1;$text[$length-$i]!=" ";$i++) {
if($i == $length) {
return substr($text,0,$length) . $tail;
}
}
for(;$text[$length-$i]=="," || $text[$length-$i]=="." || $text[$length-$i]==" ";$i++) {;}
$text = substr($text,0,$length-$i+1) . $tail;
}
return $text;
}
/*
echo(snippet("this is not too long to run on the column on the left, perhaps, or perhaps yes, no idea") . "<br>");
echo(snippetwop("this is not too long to run on the column on the left, perhaps, or perhaps yes, no idea") . "<br>");
echo(snippetgreedy("this is not too long to run on the column on the left, perhaps, or perhaps yes, no idea"));
*/
13-Feb-2007 10:45
Here is also a nice (but a bit slow) alternative for colorizing an true color image:
// $colorize = hexadecimal code in String format, f.e. "10ffa2"
// $im = the image that have to be computed
$red = hexdec(substr($colorize, 0, 2));
$green = hexdec(substr($colorize, 2, 2));
$blue = hexdec(substr($colorize, 4, 2));
$lum_c = floor(($red*299 + $green*587 + $blue*144) / 1000);
for ($i = 0; $i < $lum_c; $i++)
{
$r = $red * $i / $lum_c;
$g = $green * $i / $lum_c;
$b = $blue * $i / $lum_c;
$pal[$i] = $r<<16 | $g<<8 | $b;
}
$pal[$lum_c] = $red<<16 | $green<<8 | $blue;
for ($i = $lum_c+1; $i < 255; $i++)
{
$r = $red + (255-$red) * ($i-$lum_c) / (255-$lum_c);
$g = $green + (255-$green) * ($i-$lum_c) / (255-$lum_c);
$b = $blue + (255-$blue) * ($i-$lum_c) / (255-$lum_c);
$pal[$i] = $r<<16 | $g<<8 | $b;
}
$sy = imagesy($im);
$sx = imagesx($im);
for($y=0;$y<$sy;$y++)
{
for($x=0;$x<$sx;$x++)
{
$rgba = imagecolorat($im, $x, $y);
$a = ($rgba & 0x7F000000) >> 24;
$r = ($rgba & 0xFF0000) >> 16;
$g = ($rgba & 0x00FF00) >> 8;
$b = ($rgba & 0x0000FF);
$lum = floor(($r*299+$g*587+$b*144)/1000);
imagesetpixel($im, $x, $y, $a<<24 | $pal[$lum]);
}
}
19-Oct-2006 06:19
<?php
/**
* string substrpos(string $str, mixed $start [[, mixed $end], boolean $ignore_case])
*
* If $start is a string, substrpos will return the string from the position of the first occuring $start to $end
*
* If $end is a string, substrpos will return the string from $start to the position of the first occuring $end
*
* If the first character in (string) $start or (string) $end is '-', the last occuring string will be used.
*
* If $ignore_case is true, substrpos will not care about the case.
* If $ignore_case is false (or anything that is not (boolean) true, the function will be case sensitive.
* Both of the above: only applies if either $start or $end are strings.
*
* echo substrpos('This is a string with 0123456789 numbers in it.', 5, '5');
* // Prints 'is a string with 01234';
*
* echo substrpos('This is a string with 0123456789 numbers in it.', '5', 5);
* // Prints '56789'
*
* echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-string')
* // Prints 's is a string with 0123456789 numbers in it and two '
*
* echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-STRING', true)
* // Prints 's is a string with 0123456789 numbers in it and two '
*
* echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-STRING', false)
* // Prints 's is a string with 0123456789 numbers in it and two strings.'
*
* Warnings:
* Since $start and $end both take either a string or an integer:
* If the character or string you are searching $str for is a number, pass it as a quoted string.
* If $end is (integer) 0, an empty string will be returned.
* Since this function takes negative strings ('-search_string'):
* If the string your using in $start or $end is a '-' or begins with a '-' escape it with a '\'.
* This only applies to the *first* character of $start or $end.
*/
// Define stripos() if not defined (PHP < 5).
if (!is_callable("stripos")) {
function stripos($str, $needle, $offset = 0) {
return strpos(strtolower($str), strtolower($needle), $offset);
}
}
function substrpos($str, $start, $end = false, $ignore_case = false) {
// Use variable functions
if ($ignore_case === true) {
$strpos = 'stripos'; // stripos() is included above in case it's not defined (PHP < 5).
} else {
$strpos = 'strpos';
}
// If end is false, set it to the length of $str
if ($end === false) {
$end = strlen($str);
}
// If $start is a string do what's needed to make it an integer position for substr().
if (is_string($start)) {
// If $start begins with '-' start processing until there's no more matches and use the last one found.
if ($start{0