|
użytkowników online: 15
|
OPINIE UŻYTKOWNIKÓW
|
Nie jestem webmasterem, ale i na mnie zrobiła wrażenie szybkość reakcji Darka na mój problem. Jego kompetencja i przede wszystkim zupełnie niemodna w dzisiejszych skomercjalizowanych czasach - zwykła ludzka życzliwość dla innego człowieka. Tacy ludzie to dziś gatunek niemal wymarły...
Leszek
Wojskowy Instytut Medyczny
|
|
PODRĘCZNIK PHP 5.x, 4.x, 3.x - częściowo spolszczony / źródło: www.php.net
[Spis]
[A]
[B]
[C]
[D]
[E]
[F]
[G]
[H]
[I]
[J]
[K]
[L]
[M]
[N]
[O]
[P]
[Q]
[R]
[S]
[T]
[U]
[V]
[X]
[W]
[Z]
strpos (PHP 3, PHP 4, PHP 5) strpos --
Find position of first occurrence of a string
Descriptionint strpos ( string haystack, mixed needle [, int offset] )
Returns the numeric position of the first occurrence of
needle in the
haystack string. Unlike the
strrpos(), this function can take a full
string as the needle parameter and the
entire string will be used.
If needle is not found,
strpos() will return boolean FALSE.
| Ostrzeżenie | Ta funkcja może zwrócić
logiczne FALSE, ale także zwykłą wartość rozpoznawaną
jako FALSE, na przykład 0 lub "". Więcej
informacji w rozdziale dotyczącym
typów logicznych. Użyj
operatora === aby
sprawdzić wartość zwracaną przez tę funkcję. |
Notatka: Ta funkcja jest bezpieczna dla danych
binarnych.
Przykład 1. strpos() examples |
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
if ($pos === false) {
echo "The string '$findme' was not found in the string '$mystring'";
} else {
echo "The string '$findme' was found in the string '$mystring'";
echo " and exists at position $pos";
}
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); ?>
|
|
If needle is not a string, it is converted
to an integer and applied as the ordinal value of a character.
The optional offset parameter allows you
to specify which character in haystack to
start searching. The position returned is still relative to the
the beginning of haystack.
See also strrpos(),
stripos(),
strripos(),
strrchr(),
substr(),
stristr(), and
strstr().
User Contributed Notesanonymous at example dot com
02-Feb-2006 04:58
Beware of following the examples too closely...
$str = "abcdef";
echo strpos($str, 'b'); // outputs 1
however
$str = "abc\nef";
echo strpos($str, '\n'); // output nothing (FALSE)
Not a great way to try to stop PHP email injection attacks (as I found out).
Instead use
strpos($str, "\n")
because the escapes are processed only when using double quotes.
adispam at uid0 dot sk
09-Jan-2006 03:30
$a="nice string 1234 with number";
$b=sprintf("nice string %d", 1234);
var_dump(strpos($a,$b));
returns FALSE.
substitute : $b=sprintf("nice string %d", 1234);
with: $b = "nice string "; $b.=(string)1234;
and you 'll get correct result (0)
msandersen at t tpg dot com dot au
09-Jan-2006 03:15
<?PHP
$txt = preg_replace("|(<script.+</script>)|Usi", "", $txt);
?>
No point in keeping empty script tags. Ungreedy will prevent overzealous content removal where there are more than one set of script tags on the page. Multiline has no use here.
Otherwise, if you absolutely must have the empty tags:
<?PHP
$txt = preg_replace("|<script[^>]*>(.+)</script>|Usi", "", $txt);
?>
Martin
horst
04-Jan-2006 11:46
Why in such a way?
<?
$txt = preg_replace("/<script(.*)<\/script>/sim", "", $txt);
?>
samuraj at xmail dot cz
24-Dec-2005 10:38
there was a code (from wodzuY2k at interia dot pl) removing all between <script> tags..
but it didn't work if the tag begins like <SCRIPT language=javascript type=text/javascript>
here is function removing all between "<script" and "/script>"
<?php
function remove_js($contents)
{
while(true)
{
$begPos = strpos($contents,"<script");
if ($begPos===false) break; $endPos = strpos($contents,"/script>",$begPos+strlen("<script"));
$tmp = substr($contents,0,$begPos);
$tmp .= substr($contents,$endPos+strlen("script>"));
$contents = $tmp;
if ($loopcontrol++>100) break; continue; }
return $contents;
}
?>
Virtual Hunter root(at)autocrash(dot)ru
23-Dec-2005 04:44
If you want to find positions of all needle's in haystack,
you can use this one:
while (($pos=strpos($haystack,$needle,$pos+1))!==false) $pos_array[$i++]=$pos;
But mind, that it will find from second char. You must use $pos=-1; before you want search from first char.
{
$haystack="one two three one two three one two three one two three one";
$needle="one";
$pos=-1;
while (($pos=strpos($haystack,$needle,$pos+1))!==false) $pos_array[$i++]=$pos;
}
RESULT:
$pos_array[0] = 0
$pos_array[1] = 14
$pos_array[2] = 28
$pos_array[3] = 42
$pos_array[4] = 56
rycardo74 at gmail dot com
22-Nov-2005 06:19
this function return all src properties from a html text
in array you can filter the specifics html tags with strip_tags
$HTML=strip_tags ( $HTML, '<img>' );
$tag = trip_tag_prop("src=\"" , "\"" , $HTML);
function trip_tag_prop($ini,$end,$HTML ){
$ini_len= strlen($ini);
$end_len= strlen($end);
$inizio_pos=0;
while($inizio_pos = strpos ( $HTML, $ini, $inizio_pos)){
$fine_pos = strpos ( $HTML, $end,($inizio_pos + $ini_len));
$tag[] = substr ( $HTML, $inizio_pos + $ini_len ,($fine_pos - $inizio_pos - $ini_len) );
$inizio_pos=$fine_pos;
}
return $tag;
}
by :Auayama , cabrera rycardo74 (a) gmail (dot) com
csaba at alum dot mit dot edu
21-Nov-2005 03:00
function nthPos ($str, $needles, $n=1) {
// finds the nth occurrence of any of $needles' characters in $str
// returns -1 if not found; $n<0 => count backwards from end
// e.g. $str = "c:\\winapps\\morph\\photos\\Party\\Phoebe.jpg";
// substr($str, nthPos($str, "/\\:", -2)) => \Party\Phoebe.jpg
// substr($str, nthPos($str, "/\\:", 4)) => \photos\Party\Phoebe.jpg
$pos = -1;
$size = strlen($str);
if ($reverse=($n<0)) { $n=-$n; $str = strrev($str); }
while ($n--) {
$bestNewPos = $size;
for ($i=strlen($needles)-1;$i>=0;$i--) {
$newPos = strpos($str, $needles[$i], $pos+1);
if ($newPos===false) $needles = substr($needles,0,$i) . substr($needles,$i+1);
else $bestNewPos = min($bestNewPos,$newPos); }
if (($pos=$bestNewPos)==$size) return -1; }
return $reverse ? $size-1-$pos : $pos;
}
Csaba Gabor from Vienna
dale at ucsc dot edu
11-Nov-2005 11:28
if you want need a fast function to find the first occurrence of any ch element of an needle array this function might be of use:
<?php
$eurl = strpos_needle_array($text, array('"'=>0,'\''=>0,'>'=>0, ' '=>0, "\n"=>0), $surl);
function strpos_needle_array(& $text, $needle_ary, $offset=0){
for($ch_pos=$offset;$ch_pos<strlen($text);$ch_pos++){
if(isset($needle_ary[$text[$ch_pos]])){
return $ch_pos;
}
}
return false;
}
?>
johnjc-phpdocs at publicinfo dot net
01-Nov-2005 07:37
The === and !== are not fully documented in either the Comparison Operator, Booleans type sections. They are talked about a bit more in the sections on strpos() and array_search() but they refer you to the section on Booleans for further information.
I am putting my contribution on === and !== in the Booleans section with pointers to it from the comment areas of other sections.
http://uk.php.net/manual/en/language.types.boolean.php
info at quantummechanic dot com
06-Oct-2005 02:42
this function takes a space-deliminted string as a list of potential needles and runs it against another string as a haystack.
the number of positive matches of needles within the haystack is returned as a rounded percentile.
function keyMatch($needles,$haystack) {
$nArray=split(" ",$needles);
$found=0;
$best=count($nArray);
for($i=0;$i<count($nArray);$i++) {
$pzn=strpos(strtoupper($haystack),strtoupper($nArray[$i]));
if ($pzn>-1) { $found++; }
}
$pct=($found*100)/$best;
return round($pct);
}
$test = keyMatch("the quick wolf","the quick brown fox jumps over the lazy dog");
echo($test);
RESULT:
67
(because "the" and "quick" were found but "wolf" was not)
paul at goldenbakery dot nl
28-Sep-2005 10:51
@talthen at wp dot pl
Or you could just have typed:
if (strpos($string,$searchfor)===0)) ....
All you needed was en extra = instead of a whole function.
talthen at wp dot pl
31-Aug-2005 12:48
Because I like the way pascal functions work, so I created this little function:
function paspos($base,$findme)
{
$result=strpos($base,$findme);
if ($result===false) $result=-1;
return $result;
}
It returns -1 if the $findme may not be found in $base, or position where $findme was found in $base.
Now when you want to check if $base starts from $findme you can just type:
if (paspos($string,$searchfor)==0)) ....
Hope you'll like it :)
lindbeer at gmail dot com
26-Jul-2005 10:29
He he. I've got an updated version of the multiStrposArray function:
<?php
function multiStrposArray($haystack, $needle) {
return explode($needle, $haystack);
}
?>
vig0
11-Jul-2005 03:03
This function takes in a string and a delimiter. It then builds an array of the data in between the delimiter then returns the array. I needed this function for something that I'm doing and thought it was somewhat useful.
function multiStrposArray($haystack, $needle){
$array = array();
$row = 0;
$var = "";
for ($i=0; $i<strlen($haystack); $i++) {
if (substr($haystack, $i, 1)==$needle) {
$array[$row] = $var;
$row++;
$var = "";
} else {
$var .= substr($haystack, $i, 1);
}
}
if ($var) $array[$row] = $var;
return $array;
}
Ed Lecky-Thompson
26-Apr-2005 06:02
Here's a quick function which can replace strtotime, and will work fine on dates pre-1970 (i.e. it will return a negative number as expected).
This negative time stamp seems to be supported as an input parameter by methods like date() up to a point, but if you get crazy and start talking about dates in the 1700s (everybody was using PHP3 back then, of course) it gets upset.
For those of you doing staff databases and so forth, of course, this is probably fine - it's definitely OK for any dates post 1900, and this value has been hard coded into the function below.
function safestrtotime($strInput) {
$iVal = -1;
for ($i=1900; $i<=1969; $i++) {
# Check for this year string in date
$strYear = (string)$i;
if (!(strpos($strInput, $strYear)===false)) {
$replYear = $strYear;
$yearSkew = 1970 - $i;
$strInput = str_replace($strYear, "1970", $strInput);
};
};
$iVal = strtotime($strInput);
if ($yearSkew > 0) {
$numSecs = (60 * 60 * 24 * 365 * $yearSkew);
$iVal = $iVal - $numSecs;
$numLeapYears = 0; # Work out number of leap years in period
for ($j=$replYear; $j<=1969; $j++) {
$thisYear = $j;
$isLeapYear = false;
# Is div by 4?
if (($thisYear % 4) == 0) {
$isLeapYear = true;
};
# Is div by 100?
if (($thisYear % 100) == 0) {
$isLeapYear = false;
};
# Is div by 1000?
if (($thisYear % 1000) == 0) {
$isLeapYear = true;
};
if ($isLeapYear == true) {
$numLeapYears++;
};
};
$iVal = $iVal - (60 * 60 * 24 * $numLeapYears);
};
return($iVal);
};
yess at eleethal dot com
24-Apr-2005 05:18
Regarding James Perlman's findStr(), it's very nice although doesnt always return true when it should. I found fnmatch() to be a more accurate function for 'wildcard matching'. I'm building an IRCd and require wildmatching for many different commands. Hope this helps somone.
<?
findStr("12.12.12.*","12.12.12.12"); fnmatch("12.12.12.*","12.12.12.12"); ?>
webKami [at] akdomains.com
01-Apr-2005 10:37
You can easily skip these two meaningless comment lines in my last function.These comments are for old version of the function, I was not using length of needle in that version. Code is fine itself, I suppose ;)
<?
...
...
?>
webKami [at] akdomains.com
31-Mar-2005 05:06
Str Pos Nth (Position of nth occurance of a string)
A handy function to get the position of nth occurance of a substring in a string, with an optional param to make it case insenstive. I am calling it strposnth, suggestions welcome.
Third optional parameter gets the value of n, e.g puting in 2 will return position of second occurance of needle in haystack: Valid inputs (1 = default) 2,3,4.....
Fourth optional parameter can be used to specify the function as case insenstive: Valid inputs (0 = case senstive = default) 1 = case insenstive.
Code:
<?
function strposnth($haystack, $needle, $nth=1, $insenstive=0)
{
if ($insenstive) {
$haystack=strtolower($haystack);
$needle=strtolower($needle);
}
$count=substr_count($haystack,$needle);
if ($count<1 || $nth > $count) return false;
for($i=0,$pos=0,$len=0;$i<$nth;$i++)
{
$pos=strpos($haystack,$needle,$pos+$len);
if ($i==0) $len=strlen($needle);
}
return $pos;
}
?>
I just construct this function after trying to search a similar one to use in a shopping cart. I am using this to display a limited number of lines or text for featured products. My aim is to limit the product description to 100 characters or 3 lines / 3 list items whichever is less.
Example code goes like this
<?
$text=$row['product_desc'];
if (strlen($text)>100) $text=substr($text,0,100)." ...";
$pos=strposnth($text,"\n",3,1);
if($pos) $text=substr($text,0,$pos);
$text=nl2li($text);
echo $text;
?>
Examples:
strposnth("I am trying to go now.","o"); // returns 13 (strpos behavior)
strposnth("I am trying to go now.","O"); // returns false (strpos behavior)
strposnth("I am trying to go now.","o",2); // returns 16 (second occurance)
strposnth("I am trying to go now.","o",7); // returns false (occurance count is less than 7)
strposnth("I am trying to go now.","O",1,1); // returns 13 (stripos behavior)
strposnth("I am trying to go now.","O",3,1); // returns 19 (stripos behavior + nth occurance)
Suggestions and corrections are welcome.
Regards,
webKami [at] akdomains.com
edykory at bluebottle dot com
23-Mar-2005 01:49
a shorter version of "admin at bwongar dot com" searching function:
function strpos_array($haystack, $needle){
while (($pos = strpos($haystack, $needle, $pos)) !== FALSE)
$array[] = $pos++;
return $array;
}
I like "arias" version, but I guess strlen(aguja) can be cached in a local variable.
damy_belthazor86 at yahoo dot it
09-Mar-2005 09:10
Aw.. I forgot to post the usage of my function :)
Here's an example in which an array is filled of all the values of the attribute src of the tag img.
<?php
$imgSrcValues = getTagAttributeValues($rteHtml,"<IMG","src=");
?>
bye!
08-Mar-2005 01:32
<?
$include_path = getenv("PATH_TRANSLATED");
echo $include_path = substr($include_path, strpos($include_path, "/"), strrpos($include_path, "/"));
?>
arias at elleondeoro dot com
07-Feb-2005 03:33
If you want to get all positions in an array, you can use this function. If the optional parameter count is especified, the function will put there the number of matches.
function strallpos($pajar, $aguja, $offset=0, &$count=null) {
if ($offset > strlen($pajar)) trigger_error("strallpos(): Offset not contained in string.", E_USER_WARNING);
$match = array();
for ($count=0; (($pos = strpos($pajar, $aguja, $offset)) !== false); $count++) {
$match[] = $pos;
$offset = $pos + strlen($aguja);
}
return $match;
}
admin at bwongar dot com
21-Jan-2005 03:17
I created a useful function that returns an array with the positions within a string. For more info, read the comments:
<?php
function strpos_array($haystack, $needle){
$kill = 0; $offset = 0; $i = 0; while ($kill === 0) {
$i++;
$result = strpos($haystack, $needle, $offset);
if ($result === FALSE) { $kill = 1;
} else {
$array[$i] = $result; $offset = $result + 1; }
}
return $array;
}
?>
Benjamin
09-Jan-2005 07:46
takapz at flor dot it
03-Dec-2004 06:28
here a little function for tag parsing
function parsing($tag,$string) {
$start=strpos($string,"<" . $tag . ">" );
$start=$start + strlen("<" . $tag . ">");
$end=(strpos($string, "</" . $tag . ">"));
$num= ($end - $start);
$valore=substr($string,$start,$num);
return $valore;
}
James Perlman
11-Nov-2004 09:06
Here's a nifty function i made, that allows you to search a string using wildcards. It was intentionally made as part of a ban system.
Here is the function:
(below is how to use the function)
<?php
function findStr($search, $target) {
$matches = 0;
$search = strtolower($search);
$target = strtolower($target);
$output = "";
$search = explode("*",$search); $pos = 0;
for ($i=0; $i<count($search); $i++) {
if (strpos($target, $search[$i], $pos) != '' && strlen($search[$i])>0) {
$pos = strpos($target, $search[$i], $pos);
$matches++;
}
if (strlen($search[$i])<1) {
$matches++;
}
}
if ($matches == count($search)) {
return true;
} else {
return false;
}
}
?>
How to use the function:
<?
echo findStr("34.12.85.*","34.12.85.98"); echo findStr("3*.12.*.90","39.16.29.34"); ?>
The function searches to see if all the search terms are in the string, and if they are in the exact order you gave them in.
Hope you found this function to be helpful!
-James
ygrange at science dt uva dt nl
14-Sep-2004 01:15
Hmm. I think the maker of multi_strpos forgot to add that it allowed a negative position (if $n=0, $position[($n-1)] = $position[-1]. I just changed a slightly bit of the code to make it really correct.
I just replace
$position[$n] = (strlen($fragment[0]) + $position[($n-1)]);
by
$position[$n] = (strlen($fragment[0]) + $positione[$n]);
$positione[$n+1]=$position[$n];
philip
26-Aug-2004 12:52
Many people look for in_string which does not exist in PHP, so, here's the most efficient form of in_string() (that works in both PHP 4/5) that I can think of:
<?php
function in_string($needle, $haystack, $insensitive = 0) {
if ($insensitive) {
return (false !== stristr($haystack, $needle)) ? true : false;
} else {
return (false !== strpos($haystack, $needle)) ? true : false;
}
}
?>
christian dot NEI_TIL_SPAM at datalogen dot no
19-Aug-2004 08:26
If you want to find the position of the first character succeeding $needle, this function does it for you. $offset is optional.
<?php
function strpos_succ($haystack, $needle) {
$offset = (func_num_args() > 2) ? func_get_arg(2) : 0;
$res = strpos($haystack, $needle, $offset);
return (($res === false) ? false : $res + strlen($needle));
}
?>
Example:
<?php
$str = 'Mighty <a href="nowhere.htm">useful</a> function, this strpos_succ!';
$aPos = strpos_succ($str, ">");
?>
php .at. wwwcrm .dot. com
19-Aug-2004 07:33
Watch out for type!
The following code will return "not matched", which is a little counter-intuitive.
<?php
$val1=123;
$val2="123,456,789";
if (strpos($val2, $val1)!==false) echo "matched";
else echo "not matched";
?>
When $val1 is cast to string, it behaves as you might expect:
<?php
$val1=(string)123;
$val2="123,456,789";
if (strpos($val2, $val1)!==false) echo "matched";
else echo "not matched";
?>
Hope this saves someone the couple of hours that it took me to spot it :-)
Regards,
Alex Poole
bishop
22-Apr-2004 12:38
Code like this:
<?php
if (strpos('this is a test', 'is') !== false) {
echo "found it";
}
?>
gets repetitive, is not very self-explanatory, and most people handle it incorrectly anyway. Make your life easier:
<?php
function str_contains($haystack, $needle, $ignoreCase = false) {
if ($ignoreCase) {
$haystack = strtolower($haystack);
$needle = strtolower($needle);
}
$needlePos = strpos($haystack, $needle);
return ($needlePos === false ? false : ($needlePos+1));
}
?>
Then, you may do:
<?php
if (str_contains('this is a test', 'is')) {
echo "Found it";
}
$needlePos = str_contains('this is a test', 'is');
if ($needlePos) {
echo 'Found it at position ' . ($needlePos-1);
}
$needlePos = str_contains('this is a test', 'IS', true);
if ($needlePos) {
echo 'Found it at position ' . ($needlePos-1);
}
?>
amy_w at gmx dot de
02-Apr-2004 07:41
You can use this function to find ANY occurence of a string in an array - no matter if it is just part of one of the array elements.
it returns the key of the first found occurence or false
<?php
function search_array($needle,$haystacks) {
$found=false;
foreach ($haystacks as $key => $haystack) {
if (!(strpos($haystack,$needle)===false)) {
$found=$key;
break;
}
}
return ($found);
}
?>
ebypdx at comcast dot net
10-Mar-2004 02:26
counting the occurrences of a substring, recursive-style instead of looping.
<?
function countSubstrs($haystack, $needle)
{
return (($p = strpos($haystack, $needle)) === false) ? 0 : (1 + countSubstrs(substr($haystack, $p+1), $needle));
}
?>
nanobot2k at nanobot2k dot org
15-Feb-2004 10:45
This function will return the number of times a needle is found in a haystack...if none that it will return 0.
Cheers to lgbr for saving me the headache! :P
<?php
function totalStr($haystack, $needle,$i = 0)
{
while(strpos($haystack,$needle) !== false) {
$haystack = substr($haystack, (strpos($haystack,$needle) + 1));
$i++;
}
return $i;
}
?>
kingbusiness at hotmail dot com
18-Dec-2003 07:34
A simple function to find the number of occurances in a string within a string
<?php
function StringCount($searchstring, $findstring)
{
return (strpos($searchstring, $findstring) === false ? 0 : count(split($findstring, $searchstring)) - 1);
}
?>
jackylee at eml dot cc
20-Nov-2003 07:17
enough to search and replace a new string into a text file.
hope this can save your time :-)
original config.txt file:
Current Background = [wallpaper/WinXP.jpg]
Last Time = [20]
<?php
$var = file_get_contents("data/config.txt");
$out = fopen("data/config.txt", "w");
$var2 = writeConfig($var , "Current Background = [" , "]" , "wallpaper/Bgred.jpg");
$var2 = writeConfig($var2, "Last Time = [" , "]" , "21");
fwrite($out, $var2);
fclose($out);
function writeConfig($var, $begString, $endString, $newString)
{
$begPos = strpos($var,$begString) +strlen($begString);
$endPos = strpos($var , $endString , $begPos);
$result = substr($var, 0, $begPos);
$result .= $newString;
$result .= substr($var, $endPos);
return $result;
}
?>
changed config.txt file:
Current Background = [wallpaper/Bgred.jpg]
Last Time = [21]
peous at djingle dot com
03-Oct-2003 10:54
Function to find the first occurence of any object of the array.
<?php
function findfirstof( $txt, $arr, $start )
{
$pos = -1;
foreach( $arr as $v )
{
$p = strpos( $txt, $v, $start );
if ($p===FALSE)
continue;
if (($p<$pos)||($pos==-1))
$pos = $p;
}
return $pos;
}
?>
Ex:
$str = "find, the first word...";
$firstW = findfirstof( $str, ",?.:!" ); //returns "find"
justin at visunet dot ie
01-Oct-2003 06:20
Function:
stripos_words($haystack,'words in string')
This function finds and reports positions of all words in supplied haystack. It returns the results as an array. The array has the following structure.
Array
(
[69] => Array
(
[start] => 69
[end] => 74
[word] => honey
)
[226] => Array
(
[start] => 226
[end] => 232
[word] => cobweb
)
}
Where, for convenience, the main key also contains the positions of each found word occurrence.
If you want the main key to be 0,1,2,3,etc then set the third parameter ($pos_as_key) to false;
Hope this is of help to someone.
Cheers,
Justin :)
<?php
function stripos_words($haystack,$needles='',$pos_as_key=true)
{
$idx=0; $haystack = strtolower($haystack);
foreach ( preg_split('/[^\w]/',strtolower($needles)) as $needle )
{
$i=0; $pos_cur=0; $pos_found=0;
while ( $pos_found !== false && $needles !== '')
{
$pos_found = strpos(substr($haystack,$pos_cur),$needle);
if ( $pos_found !== false )
{
$index = $pos_as_key ? $pos_found+$pos_cur : $idx++;
$positions[$index]['start'] = $pos_found+$pos_cur;
$pos_cur += ($pos_found+strlen($needle));
$positions[$index]['end'] = $pos_cur;
$positions[$index]['word'] = $needle;
$i++;
}
}
}
if ( isset($positions) )
{
ksort($positions);
return $positions;
}
return false;
}
?>
daijoubu at videotron dot ca
30-Aug-2003 01:48
To previous comments:
I did a test with 500000 iterations, string lenght was 1846bytes long and the word to find was near the end.
Results:
if (*)
Total time in secs
Average
strpos($test, 'Possibly') === true
5.1114
0.0000102228
strpos(' '.$test, 'Possibly') > 1
7.2559
0.0000145117
is_int(strpos($test, 'Possibly'))
5.5331
0.0000110661
strstr($test, 'Possibly')
5.1461
0.0000102922
Clearly shows that === operator is the fastest
wodzuY2k at interia dot pl
07-Apr-2003 12:31
this loop removes <script>.*</script> tags from HTML contents.
<?php
while(true)
{
$begPos = strpos($contents,"<script");
if ($begPos===false) break; $endPos = strpos($contents,"script>",$begPos+strlen("<script"));
$tmp = substr($contents,0,$begPos);
$tmp .= substr($contents,$endPos+strlen("script>"));
$contents = $tmp;
if ($loopcontrol++>100) break; continue; };
?>
bebop at gmx dot at
31-Mar-2003 04:02
just another workaround for the true/0 problem:
<?php
if (!is_int(strpos($haystack,$needle))) {
}
?>
should also do the job
arduenn at hotpop dot com
18-Jan-2003 01:45
Hi all,
This function returns an array of positions (as integers) of a regular expression pattern that could occur several times within a string (or FALSE if the pattern does not occur). Note that the function is able to determine the positions of overlapping patterns. There may be shorter ways of determining multiple pattern positions (such as by using 'explode') but likely these won't find the overlapping patterns.
The multi_strpos function has one restriction (for the sake of snippet economy): if you use a pattern starting with '\*' (backslash asterisk) a hit within the string will invoke an infinite loop.
This function was initially written to create restriction maps of DNA sequences but you may find other uses.
<?
function multi_strpos($pattern, $sequence) {
$n = -1;
while (ereg($pattern, $sequence)) {
$n++;
$fragment = split($pattern, $sequence);
$trimsize = (strlen($fragment[0]))+1;
$sequence = "*".substr($sequence, $trimsize);
$position[$n] = (strlen($fragment[0]) + $position[($n-1)]);}
return $position;}
$testsequence = "She sells sea shells at the see shore.";
echo "Test sequence = '$testsequence'\n\n";
$testpattern = "s...s";
echo "Regular expression pattern = '$testpattern'\n\n";
$position = multi_strpos($testpattern, $testsequence);
if ($position) {
echo "Pattern match found at:\n";
while (list($index, $pos) = each($position)) {
echo "$pos\n";}}
?>
netmail at brownfloyd dot com
30-Dec-2002 07:31
Description:
array straipos ( string haystack, array needle [, int offset])
Returns an indexed array of the item from the array 'needle' that occurs first in the haystack, with item 0 being its position in the 'haystack', and item 1 being the item number of the item found.
If none of the items are found, it returns false.
<?php
function straipos($haystack,$array,$offset=0)
{
$occ = Array();
for ($i = 0;$i<sizeof($array);$i++)
{
$pos = strpos($haystack,$array[$i],$offset);
if (is_bool($pos)) continue;
$occ[$pos] = $i;
}
if (sizeof($occ)<1) return false;
ksort($occ);
reset($occ);
list($key,$value) = each($occ);
return array($key,$value);
}
?>
admin at kingdompeople dot com
26-Sep-2002 10:19
the following 2 functions grab a piece of content from an external html and lists that in separate places -- i.e. the title for html documents, or a list of subtopics dynamically.. the first function grabs the first found and returns a string, the second recursively searches the rest of the document and returns an array..
I found this was very useful to display articles on my website that had various topics marked by a consistent <P class=subtopic>, and the end </ P> tags..
<?php
function stripfromtext($haystack, $bfstarttext, $endsection) {
$startpostext = $bfstarttext;
$startposlen = strlen($startpostext);
$startpos = strpos($haystack, $startpostext);
$endpostext = $endsection;
$endposlen = strlen($endpostext);
$endpos = strpos($haystack, $endpostext, $startpos);
return substr($haystack, $startpos + $startposlen, $endpos - ($startpos + $startposlen));
}
function &stripfromtextarray($haystack, $bfstarttext, $endsection, $myarray=array(), $offset=0) {
$startpostext = $bfstarttext;
$startposlen = strlen($startpostext);
$startpos = strpos($haystack, $startpostext, $offset);
$endpostext = $endsection;
$endposlen = strlen($endpostext);
$endpos = strpos($haystack, $endpostext, $startpos);
$myarray[] = substr($haystack, $startpos + $startposlen, $endpos - ($startpos + $startposlen));
$offset = $endpos;
if (is_numeric(strpos($haystack, $startpostext, $offset))) {
return stripfromtextarray($haystack,$startpostext, $endpostext, &$myarray, $offset);
}
else {
return $myarray;
}
}
?>
The following is an example of the use of these functions
<?php
$filetitle = stripfromtext ($content, "<P CLASS=title>", "</ P>");
$rightmenuarray = stripfromtextarray($content, "<P CLASS=subtitle>", "</ P>");
foreach ($rightmenuarray as $rm) {$rightmenu.=$rm."<br>";}
?>
anonymous dot coward at slashdot dot org
20-Sep-2002 11:19
Even simpler method to get around that zero/false headache:
if (strpos(' '.$string,$substring) > 1)
{
echo('substring present!');
}
Simly add a space to your string being tested. Your first real string position then becomes 1, and zero really means "string not found". Please adjust your position formulas accordingly (substract 1).
http://cm.zetyx.net/
18-Sep-2002 09:48
About issue:
Zero (0) is not a false result; it is a valid answer. The function returns 0 because "abc" does indeed contain "abc" and the first occurence of the target string starts at position 0.
Use === to test if the function returned true or false.
Try my simple and easy way for use at several PHP version.
$buf = "When doves cry.";
$chk = "Wh";
if (strpos( "#$%".$buf, $chk)) { return TRUE; }
else { return FALSE; }
one at groobo dot com
15-Aug-2002 10:04
You all know it probably, but it is quicker to use strpos() function to check an existence of a character in a string, instead of regular expressions.
dont at spam dot net
24-Jul-2002 04:14
To: redeagle@chello.nl
Zero (0) is not a false result; it is a valid answer. The function returns 0 because "abc" does indeed contain "abc" and the first occurence of the target string starts at position 0.
Use === to test if the function returned true or false.
redeagle at chello dot nl
23-Jul-2002 05:39
I've just did a test using strpos:
-
$test = strpos("abc", "abc");
echo($test);
-
Note that $test will return zero (false) if the seccond parameter is the same as the first parameter.
schofiel at cs dot ualberta dot ca
19-Jul-2002 09:46
Only 0 is false in PHP non-zero is postive
so -2 could be a true.
Since they can't use zero becuase it is in
the range of possible correct positions within
a string.
So do the type check against false explicity
to prevent odd behavior
jjrocket at yahoo dot com
04-May-2002 10:22
It may be obvious to most, but the number returned by strpos will be the position in haystack at which the string needle starts.
For example if haystack is "Now is the time" and needle is "Now", then strpos will return 0, not 2.
martin at netimage dot dk
19-Apr-2002 04:54
I use this
$a=strpos($haystack,$needle,$offset);
if($a!==false) # note the check for type equivalence
// found
else
// not found
soletan at toxa dot de
10-Feb-2002 02:28
Better to use the original example from reference part for checking, if strpos failed or not with version before 4.03b.
When pos is an integer and is interpreted as boolean false (so it is 0) strpos FOUND something immediately at the haystack's beginning ...
maharj at DONTSPAMutu dot fi
14-Jan-2002 12:51
I'm not sure if this is common, but I'll take an example:
$str="123456test7890";
If I do:
for($i=0;$i<strpos($str, "te");$i++)
print $str[$i];
print "Hey mon";
for($i=strpos($str,"st")+2;$i<strlen($str);$i++)
print $str[$i];
on the second loop the strpos() returns something, that is not true. (pos=2 or something).
Solution: Before for:s take the boundaries to variables like:
$startPos=strpos($str, "te");
$endPos=strpos($str, "st")+2;
anduse them in for-loops
Yes, I know I can ereg("(.*)test(.*)",$str,$parm) but I just came across this...
The PHP version I'm using is 4.0.4pl1
:)Mikko
nmmm at nmmm dot nu
08-Jan-2002 02:44
if you want to check if a string includes some character, you may use code like this ('x' is in position 0 in the string so if $c is 'x' if structure will return false :)
$c='5';
$s='01234567890';
if (strpos($s, 'x'.$c))
echo "$c is a number!";
Michael-Rudel at gmx dot de
22-Nov-2001 03:01
The example above for versions older than 4.0b3 should check for integer, since strpos returns an integer, not a string. So it should read:
// in versions older than 4.0b3:
$pos = strpos($mystring, "b");
if (is_integer($pos) && !$pos) {
// not found...
}
GrandLibrarian at iname dot com
27-Apr-2000 06:02
To find the position of a string in a case-insensitive manner without converting everything to lowercase, try using stristr:<br>
$temp = stristr($haystack,$needle);<br>
$pos = strlen($haystack)-strlen($temp);
|