Hi again,
My code, in previews note wasn't correct ... So here's the good one :
<?
$myString = "Hi, this is good!";
$srchStrg = ".*thi.* goo.*";
$srchRes = preg_match("/$srchStrg/", $myString);
if ( $srchRes != 0 )
echo "TRUE: string has been found :-)";
else
echo "FALSE: string wasn't found :'-(";
?>
Sincerely
strpos
(PHP 4, PHP 5)
strpos — Trova la posizione della prima occorrenza di una stringa
Descrizione
Restituisce la posizione numerica della prima occorrenza di needle nella stringa haystack . Differentemente rispetto a strrpos(), questa funzione considera tutta la stringa needle , e, quindi, cercherà tutta la stringa.
Se needle non viene trovato strpos() restituirà boolean FALSE.
Questa funzione può restituire il Booleano FALSE, ma può anche restituire un valore non-Booleano valutato come FALSE, come ad esempio 0 o "". Per favore fare riferimento alla sezione Booleans per maggiori informazioni. Usare l'operatore === per controllare il valore restituito da questa funzione.
Nota: Questa funzione è binary-safe (gestisce correttamente i file binari)
Example #1 Esempio di uso di strpos()
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
// Notate l'uso di ===. Il == non avrebbe risposto come atteso
// poichè la posizione di 'a' è nel primo carattere.
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";
}
// Ricerca di un carattere ignorando qualsiasi cosa prima di offset
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, not 0
?>
Se needle non è una stringa, viene convertito in un intero e utilizzato come valore ordinale di un carattere.
Il parametro opzionale offset permette di indicare da quale carattere in haystack iniziare la ricerca. La posizione restituita è, comunque, relativa all'inizio di haystack .
Vedere anche strrpos(), stripos(), strripos(), strrchr(), substr(), stristr() e strstr().
strpos
25-Aug-2008 04:14
25-Aug-2008 03:26
Easy function for determining how many times is searched string included in the input one:
<?php
$input = "bu bu bu bu lalala"; // example string
$searched = "bu"; // string we'll try to count in example one
$count = 0;
$buffer = $input;
while ( true ) { // nasty infinite loop x) ..
$next_position = strpos( $buffer, $searched );
if ( $next_position === false ) // ..but followed with quite strong breaking rule
break;
$buffer = substr( $buffer, $next_position + strlen( $searched ) );
$count++;
}
echo $count;
?>
22-Aug-2008 05:01
Hi,
Chuzasoft Inc : maybe I haven't understood your goal clearly, but I think there is a faster way to determinate whether a pattern is contained in a string (like using the " LIKE '%bla bla%' " in SQL).
You should read about "Regular Expression" (powerfull string operations are allowed using it) : http://fr.php.net/manual/en/book.pcre.php
Your example, it should be written like this :
<?
$myString = "Hi, this is good!";
$srchStrg = ".*thi.* goo.*";
$srchRes = preg_match("/$searchThis/", $myString);
if ( $searchResult != 0 )
echo "TRUE: string has been found :-)";
else
echo "FALSE: string wasn't found :'-(";
?>
Sincerely
06-Aug-2008 03:16
Hi! Don't you people miss the pretty comparison operator 'LIKE' from mySql in PHP??.
I've made this funtion to emulate that method. It's for search a match string into another String
using the '%' caracter just like you do un the LIKE syntax.
For example:
<?php
$mystring = "Hi, this is good!";
$searchthis = "%thi% goo%";
$resp = milike($mystring,$searchthis);
if ($resp){
echo "milike = VERDADERO";
} else{
echo "milike = FALSO";
}
?>
Will print:
milike = VERDADERO
and so on...
this is the function:
<?php
function milike($cadena,$busca){
if($busca=="") return 1;
$vi = split("%",$busca);
$offset=0;
for($n=0;$n<count($vi);$n++){
if($vi[$n]== ""){
if($vi[0]== ""){
$tieneini = 1;
}
} else {
$newoff=strpos($cadena,$vi[$n],$offset);
if($newoff!==false){
if(!$tieneini){
if($offset!=$newoff){
return false;
}
}
if($n==count($vi)-1){
if($vi[$n] != substr($cadena,strlen($cadena)-strlen($vi[$n]), strlen($vi[$n]))){
return false;
}
} else {
$offset = $newoff + strlen($vi[$n]);
}
} else {
return false;
}
}
}
return true;
}
?>
Good luck!
27-Jun-2008 04:51
Paul: May it be that the ! operator is evaluated before the ===? In this case, the return value of strpos (0 in the described case) would be implicitly converted to bool (value true because 0 converts to false). Then, true === false is evaluated to false.
18-Jun-2008 06:48
I wasn't aware of the !== operator, only the === for false. I was using this code on strpos:
while( ! ($start=@strpos($source,$startTag,$end)) === false)
This gave a false if the string was found at position 0, which is weird.
However using
while(($start=@strpos($source,$startTag,$end)) !== false)
Gives no such error and seems to work correctly
26-May-2008 09:19
Hello! I was founding a function, which finds any occurence of a string (no: first occurence). I wasn't, so I maked this function! It may be very useful.
<?php
int strnpos(string $haystack, mixed $needle, int $occurence);
?>
Example:
<?php
strnpos("I like the bananas. You like coke. We like chocolate.", "like", 2); // 24
?>
Here's code of this function:
<?php
function strnpos($base, $str, $n)
{
if ($n <= 0 || intval($n) != $n || substr_count($base, $str) < $n) return FALSE;
$str = strval($str);
$len = 0;
for ($i=0 ; $i<$n-1 ; ++$i)
{
if ( strpos($base, $str) === FALSE ) return FALSE;
$len += strlen( substr($base, 0, strpos($base, $str) + strlen($str)) );
$base = substr($base, strpos($base, $str) + strlen($str) );
}
return strpos($base, $str) + $len;
}
?>
02-Apr-2008 08:17
This might be useful.
class String{
//Look for a $needle in $haystack in any position
public static function contains(&$haystack, &$needle, &$offset)
{
$result = strpos($haystack, $needle, $offset);
return $result !== FALSE;
}
//intuitive implementation .. if not found returns -1.
public static function strpos(&$haystack, &$needle, &$offset)
{
$result = strpos($haystack, $needle, $offset);
if ($result === FALSE )
{
return -1;
}
return $result;
}
}//String
20-Feb-2008 11:08
Refereing to my last note.
It wasn't correct! As ctype_digit only evaluates strings.
(string) true / false will still be 0 / 1.
is_int(); is the correct function!
18-Feb-2008 02:22
As mentioned before....
0 === false
0 == false
1 === true
etc...
I found it very usefull to use ctype_digit(); with this function!
<?php
$string = 'whatever!#%@^% is going on...'; //correct
//$string = 'whatever? is going on...'; //false char 8
//ctype_digit only works on strings so type cast...
if(ctype_digit((string) strpos($string, '?'))){
echo 'found at least one...<br/>'.PHP_EOL;
}
else{
echo 'no char index retrieved... <br/>'.PHP_EOL;
}
?>
12-Jan-2008 08:02
There's actually a fourth conceivable test for "any position other than 0" --
ADD:
!= "" (disrecommended as highly confusing)
This then makes the final paragraph inaccurate (one case where comparing to "" is meaningful). It should just be removed entirely -- too much unneeded detail on a tangent anyway.
12-Jan-2008 07:45
WARNING
As strpos may return either FALSE (substring absent) or 0 (substring at start of string), strict versus loose equivalency operators must be used very carefully.
To know that a substring is absent, you must use:
=== FALSE
To know that a substring is present (in any position including 0), you can use either of:
!== FALSE (recommended)
> -1 (note: or greater than any negative number)
To know that a substring is at the start of the string, you must use:
=== 0
To know that a substring is in any position other than the start, you can use any of:
> 0 (recommended)
!= 0 (note: but not !== 0 which also equates to FALSE)
!= FALSE (disrecommended as highly confusing)
Also note that you cannot compare a value of "" to the returned value of strpos. With a loose equivalence operator (== or !=) it will return results which don't distinguish between the substring's presence versus position. With a strict equivalence operator (=== or !==) it will always return false.
24-Dec-2007 08:45
WARNING: The documentation says:
"Use the === operator for testing the return value of this function"
but it should say:
"Use '!== false' or '=== false' for testing the return value of this function"
Therefore to test if a needle occurst in a hastack do this:
if ( strpos($haystack, $needle) !== false){
echo 'found needle in haystack!';
}
Using '=== true' or '!== true' or '== true' or '== false' will all return the wrong value when the needle is found in the haystack.
using ' >= 0 ' returns the wrong value when the needle is not found in the haystack.
By "wrong value" I mean a value that is counter-intuitive but is never-the-less correct according to the weird way in which strpos has been coded. Why on earth didn't they just return -1 if the needle was not found? Then we could just test for >= 0
Here's a full list of the value returned:
(strpos("bbb", "aaa") >= 0) returns true EXPECTED FALSE
(strpos("bbb", "aaa") == true) returns false expected false
(strpos("bbb", "aaa") == false) returns true expected true
(strpos("bbb", "aaa") === true) returns false expected false
(strpos("bbb", "aaa") === false) returns true expected true
(strpos("bbb", "aaa") !== false) returns false expected false
(strpos("bbb", "aaa") !== true) returns true expected true
(strpos("aaa", "aaa") >= 0) returns true expected true
(strpos("aaa", "aaa") == true) returns false EXPECTED TRUE
(strpos("aaa", "aaa") == false) returns true EXPECTED FALSE
(strpos("aaa", "aaa") === true) returns false EXPECTED TRUE
(strpos("aaa", "aaa") !== false) returns true expected true
(strpos("aaa", "aaa") === false) returns false expected false
(strpos("aaa", "aaa") !== true) returns true EXPECTED FALSE
31-Oct-2007 06:19
A further implementation of the great rstrpos function posted in this page. Missing some parameters controls, but the core seems correct.
<?php
// Parameters:
//
// haystack : target string
// needle : string to search
// offset : which character in haystack to start searching, FROM THE END OF haystack
// iNumOccurrence : how many needle to search into haystack beginning from offset ( i.e. the 4th occurrence of xxx into yyy )
function rstrpos ($haystack, $needle, $offset=0, $iNumOccurrence=1)
{
//
$size = strlen ($haystack);
$iFrom = $offset;
$iLoop = 0;
//
do
{
$pos = strpos (strrev($haystack), strrev($needle), $iFrom);
$iFrom = $pos + strlen($needle);
}
while ((++$iLoop)<$iNumOccurrence);
//
if($pos === false) return false;
//
return $size - $pos - strlen($needle);
}
?>
14-Oct-2007 07:49
str_replace evaluates its arguments exactly once.
for example:
<?php
$page = str_replace("##randompicture##", getrandompicture(), $page);
?>
will call getrandompicture() once, ie it will insert the same random picture for each occurrence of ##randompicture## :(
Here is my quick and dirty workaround:
<?php
function add_random_pictures($text) {
while (($i = strpos($text, "##randompicture##")) !== false) {
$text = substr_replace($text, getrandompicture(), $i, strlen("##randompicture##"));
}
return $text;
}
$page = add_random_pictures($page);
?>
09-Sep-2007 05:51
Just to be clear: unlike stripos(), strpos() is case-sensitive.
28-Aug-2007 07:05
@Wagner Christian:
Yes, there are better methods. The best is to just cast is. You cast like this:
<?php
$id = 1;
$string = (string) $id;
?>
If you var_dump() $string now you get the following output:
string(1) "1"
This is the recommended method. You're example should look like this then:
<?php
$id = 1;
$my_text = "hel124lo";
$first_position =strpos($my_text , (string) $id);
?>
17-Aug-2007 04:11
If you plan to use an integer as needle you need first to convert your integer into a String else it's not going to work.
For exemple :
<?php
$id = 1;
$my_text = "hel124lo";
$first_position =strpos($my_text ,substr($id,0));
?>
There are for sure some another solutions to convert an integer into a string in php.
15-May-2007 05:21
This is a bit more useful when scanning a large string for all occurances between 'tags'.
<?php
function getStrsBetween($s,$s1,$s2=false,$offset=0) {
/*====================================================================
Function to scan a string for items encapsulated within a pair of tags
getStrsBetween(string, tag1, <tag2>, <offset>
If no second tag is specified, then match between identical tags
Returns an array indexed with the encapsulated text, which is in turn
a sub-array, containing the position of each item.
Notes:
strpos($needle,$haystack,$offset)
substr($string,$start,$length)
====================================================================*/
if( $s2 === false ) { $s2 = $s1; }
$result = array();
$L1 = strlen($s1);
$L2 = strlen($s2);
if( $L1==0 || $L2==0 ) {
return false;
}
do {
$pos1 = strpos($s,$s1,$offset);
if( $pos1 !== false ) {
$pos1 += $L1;
$pos2 = strpos($s,$s2,$pos1);
if( $pos2 !== false ) {
$key_len = $pos2 - $pos1;
$this_key = substr($s,$pos1,$key_len);
if( !array_key_exists($this_key,$result) ) {
$result[$this_key] = array();
}
$result[$this_key][] = $pos1;
$offset = $pos2 + $L2;
} else {
$pos1 = false;
}
}
} while($pos1 !== false );
return $result;
}
?>
26-Apr-2007 11:58
Here's a somewhat more efficient way to truncate a string at the end of a word. This will end the string on the last dot or last space, whichever is closer to the cut off point. In some cases, a full stop may not be followed by a space eg when followed by a HTML tag.
<?php
$shortstring = substr($originalstring, 0, 400);
$lastdot = strrpos($shortstring, ".");
$lastspace = strrpos($shortstring, " ");
$shortstring = substr($shortstring, 0, ($lastdot > $lastspace? $lastdot : $lastspace));
?>
Obviously, if you only want to split on a space, you can simplify this:
<?php
$shortstring = substr($originalstring, 0, 400);
$shortstring = substr($shortstring, 0, strrpos($shortstring, " "));
?>
Thanks to spinicrus (see above) I have sorted out a problem that was bugging me for ages. I have a routine in Etomite Content Management System that will display a set number of characters of a news item and invite visitors to "Read more".
Unfortunately the 400 character summary sometimes displayed a partial word at the end.
Using the following code based on spinicrus's exampleI have now overcome this.
#################################
#only full word at the end
$string=$rest;
$charToFind=" ";
$searchPos = $lentoshow;
$searchChar = '';
//
while ($searchChar != $charToFind) {
$newPos = $searchPos-1;
$searchChar = substr($string,$newPos,strlen($charToFind));
$searchPos = $newPos;
}
$rest=substr($string,0,$searchPos)." ";
################################
11-Apr-2007 08:35
If you want to check for either IE6 or 7 individually.
<?php
function browserIE($version)
{
if($version == 6 || $version == 7)
{
$browser = strpos($_SERVER['HTTP_USER_AGENT'], "MSIE ".$version.".0;");
if($browser == true)
{
return true;
}
else
{
return false;
}
else
{
return false;
}
?>
04-Apr-2007 12:57
this function returns the text between 2 strings:
function get_between ($text, $s1, $s2) {
$mid_url = "";
$pos_s = strpos($text,$s1);
$pos_e = strpos($text,$s2);
for ( $i=$pos_s+strlen($s1) ; ( ( $i < ($pos_e)) && $i < strlen($text) ) ; $i++ ) {
$mid_url .= $text[$i];
}
return $mid_url;
}
if $s1 or $s2 are not found, $mid_url will be empty
to add an offset, simply compare $pos_s to the offset, and only let it continue if the offset is smaller then $pos_s.
26-Jan-2007 03:23
Get text between $s1 and $s2, return an array contains every occurrence (based on code of old comment/s but with offset and without strtolower)
Sample:
$myDivsContent = getStrsBetween("<div","</div>",$myHtmlSrc);
Sample:
or...get rows for html table
...
...
//using TextBetween from old comment...
$aTable = TextBetween("<table","</table>",$myHtmlSrc);
$rows = getStrsBetween("<tr","</tr>",$aTable);
...
...
function getStrsBetween($s1,$s2,$s,$offset=0){
$result = array();
$index= 0;
$L1 = strlen($s1);
$found = false;
do{
if($L1>0){
$pos1 = strpos($s,$s1,$offset);
}
else {
$pos1=$offset;
}
if($pos1 !== false){
if($s2 == '')
$result[$index++]= substr($s,$pos1+$L1);
$pos2 = strpos(substr($s,$pos1+$L1),$s2,$L1);
if($pos2!==false){
$result[$index++]= substr($s,$pos1+$L1,$pos2);
$offset += $pos2 + strlen($s2);
}
else{
$pos1 = false;
}
}
}while($pos1 !== false);
return $result;
}
BUGs/Problems:
Function do not stop while $s1 is found in $s.
20-Jan-2007 04:15
Try this function to find the first position of needle before a given offset.
For example:
<?php
$s = "This is a test a is This";
$offset = strpos($s, "test");
strnpos($s, "is", $offset); // returns 17
strnpos($s, "is", -$offset); // returns 5
// Works just like strpos if $offset is positive.
// If $offset is negative, return the first position of needle
// before before $offset.
function strnpos($haystack, $needle, $offset=0)
{
if ($offset>=0)
$result=strpos($haystack, $needle, $offset);
else
{
$offset=strlen($haystack)+$offset;
$haystack=strrev($haystack);
$needle=strrev($needle);
$result=strpos($haystack, $needle, $offset);
if ($result!==false)
{
$result+=strlen($needle);
$result=strlen($haystack)-$result;
}
}
return $result;
}
?>
this is nice you are so excited but parsing href=" will never really work.
remember whitespaces
29-Dec-2006 04:30
I understand the excitement of "admin at xylotspace dot com." I wrote three functions that I use in EVERY website I develop. What they do is get the text between strings. I made them case-insensitive (for php < 5) using "strtolower." This would not be necessary if you used "stripos." Now the first function is close to what "admin at xylotspace dot com" wrote, but does not have the position element. It also will return an empty string if no substring was found. If you want to get the title of an HTML document use:
TextBetween('<title>','</title>',$content);
The second function was revolutionary for me, because it gets an array of items between pairs of strings. So, with that I can grab most XML lists, or get all the links or images in a document. All the links in a document could be found using:
TextBetweenArray('href="','"',$content);
The third is less used, but is useful to process an array and get substrings within each record.
//-----GET TEXT BETWEEN STRINGS------
function TextBetween($s1,$s2,$s){
$s1 = strtolower($s1);
$s2 = strtolower($s2);
$L1 = strlen($s1);
$scheck = strtolower($s);
if($L1>0){$pos1 = strpos($scheck,$s1);} else {$pos1=0;}
if($pos1 !== false){
if($s2 == '') return substr($s,$pos1+$L1);
$pos2 = strpos(substr($scheck,$pos1+$L1),$s2);
if($pos2!==false) return substr($s,$pos1+$L1,$pos2);
}
return '';
}
//-----GET ARRAY TEXT BETWEEN STRINGS------
function TextBetweenArray($s1,$s2,$s){
$myarray=array();
$s1=strtolower($s1);
$s2=strtolower($s2);
$L1=strlen($s1);
$L2=strlen($s2);
$scheck=strtolower($s);
do{
$pos1 = strpos($scheck,$s1);
if($pos1!==false){
$pos2 = strpos(substr($scheck,$pos1+$L1),$s2);
if($pos2!==false){
$myarray[]=substr($s,$pos1+$L1,$pos2);
$s=substr($s,$pos1+$L1+$pos2+$L2);
$scheck=strtolower($s);
}
}
} while (($pos1!==false)and($pos2!==false));
return $myarray;
}
//-----GET SUBTEXT IN ARRAY ITEMS------
function SubTextBetweenArray($s1,$s2,$myarray){
for ($i=0; $i< count($myarray); $i++)
{$myarray[$i]=TextBetween($s1,$s2,$myarray[$i]);}
return $myarray;
}
18-Dec-2006 06:31
I've been looking at previous posts and came up with this function to find the start and end off an certain occurance or all occurances of needle within haystack.
I've made some minor tweaks to the code itself, like counting the length of needle only once and counting the result set array instead of using a count variable.
I also added a length parameter to the result set to use in a following substr_replace call etc...
<?php
function strpos_index($haystack = '',$needle = '',$offset = 0,$limit = 99,$return = null)
{
$length = strlen($needle);
$occurances = array();
while((($count = count($occurances)) < $limit) && (false !== ($offset = strpos($haystack,$needle,$offset))))
{
$occurances[$count]['length'] = $length;
$occurances[$count]['start'] = $offset;
$occurances[$count]['end'] = $offset = $offset + $length;
}
return $return === null ? $occurances : $occurances[$return];
}
?>
04-Dec-2006 04:10
Small improvement on the efforts of others:
<?php
function strpos_all($hs_haystack, $hs_needle, $hn_offset = 0, $hn_limit = 0) {
$ha_positions = array();
$hn_count = 0;
while (false !== ($pos = strpos($hs_haystack, $hs_needle, $hn_offset)) && ($hn_limit == 0 || $hn_count < $hn_limit)) {
$ha_positions[] = $pos;
$hn_offset = $pos + strlen($hs_needle);
++$hn_count;
}
return $ha_positions;
}
function preg_pos($hs_pattern, $hs_subject, &$hs_foundstring, $hn_offset = 0) {
$hs_foundstring = NULL;
if (preg_match($hs_pattern, $hs_subject, $ha_matches, PREG_OFFSET_CAPTURE, $hn_offset)) {
$hs_foundstring = $ha_matches[0][0];
return $ha_matches[0][1];
}
else {
return FALSE;
}
}
function preg_pos_all($hs_pattern, $hs_subject, &$ha_foundstring, $hn_offset = 0, $hn_limit = 0) {
$ha_positions = array();
$ha_foundstring = array();
$hn_count = 0;
while (false !== ($pos = preg_pos($hs_pattern, $hs_subject, $hs_foundstring, $hn_offset)) && ($hn_limit == 0 || $hn_count < $hn_limit)) {
$ha_positions[] = $pos;
$ha_foundstring[] = $hs_foundstring;
$hn_offset = $pos + 1; // alternatively: '$pos + strlen($hs_foundstring)'
++$hn_count;
}
return $ha_positions;
}
print_r(preg_pos_all('/s...s/', "she sells sea shells on the sea floor", $ha_matches));
print_r($ha_matches);
?>
15-Oct-2006 01:58
if you want to get the position of a substring relative to a substring of your string, BUT in REVERSE way:
<?php
function strpos_reverse_way($string,$charToFind,$relativeChar) {
//
$relativePos = strpos($string,$relativeChar);
$searchPos = $relativePos;
$searchChar = '';
//
while ($searchChar != $charToFind) {
$newPos = $searchPos-1;
$searchChar = substr($string,$newPos,strlen($charToFind));
$searchPos = $newPos;
}
//
if (!empty($searchChar)) {
//
return $searchPos;
return TRUE;
}
else {
return FALSE;
}
//
}
?>
27-Sep-2006 10:33
Yay! I came up with a very useful function. This finds a beginning marker and an ending marker (the first after the beginning marker), and returns the contents between them. You specify an initial position in order to tell it where to start looking. You can use a while() or for() loop to get all occurence of a certain string within a string (for example, taking all hyperlinks in a string of HTML code)...
function get_middle($source, $beginning, $ending, $init_pos) {
$beginning_pos = strpos($source, $beginning, $init_pos);
$middle_pos = $beginning_pos + strlen($beginning);
$ending_pos = strpos($source, $ending, $beginning_pos + 1);
$middle = substr($source, $middle_pos, $ending_pos - $middle_pos);
return $middle;
}
For example, to find the URL of the very first hyperlink in an HTML string $data, use:
$first_url = get_middle($data, '<a href="', '"', 0);
It's done wonders for scraping HTML pages with certain tools on my website.
25-Aug-2006 09:07
To thepsion5 at hotmail dot com:
Please mind the warning part of the documentation!
Your function won't work on $Haystack s starting with $needle.
Here's a solution for that:
<?
function findAllOccurences($Haystack, $needle, $limit=0)
{
$Positions = array();
$currentOffset = 0;
$count=0;
while(($pos = strpos($Haystack, $needle, $offset))!==false && ($count < $limit || $limit == 0))
{
$Positions[] = $pos;
$offset = $pos + strlen($needle);
$count++;
}
return $Positions;
}
?>
11-Aug-2006 03:38
Simple function to determine if a needle occurs in a haystack
function is_substr($needle, $haystack){
$pos = strpos($haystack, $needle);
if ($pos === false) {
return false;
} else {
return true;
}
}
08-Aug-2006 01:57
I created this little function based on the one posted by chasesan at gmail dot com; It find all occurences of a string within another string and returns their positions as an array:
<?PHP
function findAllOccurences($Haystack, $needle, $limit=0)
{
$Positions = array();
$currentOffset = 0;
$count=0;
while(($pos = strpos($Haystack, $needle, $offset)) && ($count < $limit || $limit == 0))
{
$Positions[] = $pos;
$offset = $pos + strlen($needle);
$count++;
}
return $Positions;
}
?>
I hope this helps someone :)
25-Jul-2006 02:24
I finally figured out how to use this function correctly (and efficiently) if you want to test for a needle that may start at the beginning of haystack, simply use
if (strpos($haystack, $needle) === 0)) {
do stuff here..
}
someone else mentioned that you needed to assign a variable first and test to make sure that it was === true first.. That is not needed
19-Jul-2006 08:26
Im sure there are more efficient methods of this, but i use this alot when dealing with rss and was proud of it.
<?
function data_from_element($needle,$haystack,$tags=FALSE) { // Expects two Strings, returns Array
$needle_start = "<".$needle.">"; $needle_end = "</".$needle.">";
$array = array(); $pos_start = 0;
while(($pos_start = strpos($haystack,$needle_start,$pos_start)) !== false) {
$pos_end = strpos($haystack,$needle_end,$pos_start);
if($tags) $array[] = substr($haystack,$pos_start,$pos_end-$pos_start+strlen($needle_end));
else $array[] = substr($haystack,$pos_start + strlen($needle_start),$pos_end - $pos_start - strlen($needle_start));
$pos_start++;
}
return $array;
}
d
//example
$rss = '<?xml version="1.0"?> <rss version="2.0"> <channel> <title>Example RSS</title> <description>Example RSS Description</description> <link>http://example.com/rss/</link> <item> <title>Example RSS 1</title> <link>http://example.com/rss/1.html</link> <description>Example 1</description> </item> <item> <title>Example RSS 2</title> <link>http://example.com/rss/2.html</link> <description>Example 2</description> </item> </channel> </rss>';
$items = data_from_elements(link,$rss); // $rss[0] => "http://example.com/rss/"
$items = data_from_elements(link,$rss,true); // $rss[0] => "<link> http://example.com/rss/ </link>"
?>
12-Jul-2006 06:48
You can use strpos to produce a funciton that will find the nth instance of a certain string within a string. Personally I find this function almost more useful then strpos itself.
I kinda wish they would put it stock into php but I doupt thats gonna happen any time soon. ^_^
Here is da code:
<?php
//just like strpos, but it returns the position of the nth instance of the needle (yay!)
function strpos2($haystack, $needle, $nth = 1)
{
//Fixes a null return if the position is at the beginning of input
//It also changes all input to that of a string ^.~
$haystack = ' '.$haystack;
if (!strpos($haystack, $needle))
return false;
$offset=0;
for($i = 1; $i < $nth; $i++)
$offset = strpos($haystack, $needle, $offset) + 1;
return strpos($haystack, $needle, $offset) - 1;
}
?>
06-Jul-2006 02:56
If you're wanting a simple "strpos" using a pattern and don't need the complexity of multi_strpos below, this function (for PHP 4.3.0+) returns the regex position.
function preg_pos($sPattern, $sSubject, &$FoundString, $iOffset = 0) {
$FoundString = NULL;
if (preg_match($sPattern, $sSubject, $aMatches, PREG_OFFSET_CAPTURE, $iOffset) > 0) {
$FoundString = $aMatches[0][0];
return $aMatches[0][1];
}
else {
return FALSE;
}
}
It also returns the actual string found using the pattern, via $FoundString.
28-Apr-2006 04:28
As a simplified way of doing what the poster below did:
<?php
$firstName .= '\'';
if (!preg_match('/[sx]$/', $firstName)) {
$firstName .= 's';
}
?>
If you feel using a regular expression is too much, try it - I've not tested yet, but I'd say preg_match() is faster then two strpos() calls.
23-Mar-2006 05:26
If you only want to look, if a string appears in another string - even at position 0 - , you can also use substr_count():
<?php
$mystring = "Hello Chris";
if (substr_count($mystring, "Hello") == 0)
echo "no";
// same as:
if (strpos($mystring, "Hello") === false)
echo "no";
?>
05-Mar-2006 02:17
<?php
//use a string as needle, even in PHP 4
//works the same like strrpos()
function stringrpos( $sHaystack, $sNeedle )
{
$i = strlen( $sHaystack );
while ( substr( $sHaystack, $i, strlen( $sNeedle ) ) != $sNeedle )
{
$i--;
if ( $i < 0 )
{
return false;
}
}
return $i;
}
?>
this works fine:
function getCurrentBrowser() {
$browser = $_SERVER['HTTP_USER_AGENT'];
if (strpos(strtoupper($browser), 'MSIE') !== false) {
return "Internet Explorer";
} else if (strpos(strtoupper($browser), 'FIREFOX') !== false) {
return "Firefox";
} else if (strpos(strtoupper($browser), 'KONQUEROR') !== false) {
return "Konqueror";
} else if (strpos(strtoupper($browser), "LYNX") !== false) {
return "Lynx";
} else {
return $browser;
}
}
if $browser ist
"Lynx/2.8.5rel.2 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7g"
its work fine, too.
15-Feb-2006 11:49
"fox_galih at yahoo dot co dot uk" example below is absolutely not needed. As the example on this page shows, you can differentiate between position 0 and false by doing a strict comparison (===):
$newsbody = "<p>This is paragraph</p>";
if( strpos( $newsbody, "<p>" ) === 0 ) {
// will only get executed if string starts with <p>
// (false === 0) evaluates to false
}
11-Feb-2006 05:42
Be carefull when your searching position is in first index. For example:
$newsbody = "<p>This is paragraph</p>";
if( strpos( $newsbody, "<p>" ) == 0 ) {
// do something
}
when strpos returns FALSE, this "if block" will be executed by PHP, because FALSE also has 0 value. So, you have to make it a little bit longer of code:
$pos = strpos( $newsbody, "<p>" );
if ( $pos != FALSE ) {
$pos = strpos( $newsbody, "<p>" );
if( $pos == 0 )
$newsbody = substr( $newsbody, 3 );
}
03-Feb-2006 08:11
<?php //prepocet velikosti souboru
function format($soubor) {
$velikost = filesize($soubor);
if($velikost < 1048576):
return number_format(($velikost / 1024), 2, ',', ' ')." kB";
else:
return number_format(($velikost / 1024 / 1024), 2, ',', ' ')." MB";
endif;
}
?>
<?php
function read_dir($dir)
{
$path = opendir($dir);
while (false !== ($file = readdir($path))):
if ($file!="." && $file!=".."):
if (is_file($dir."/".$file)):
$items[] = $file;
else:
$items[] = $dir."/".$file;
endif;
endif;
endwhile;
closedir($path);
if ($items):
natcasesort($items);
foreach ($items as $item){
if (is_dir($item)):
$dir1 = $item;
$item1 = substr($item, strrpos($item, '/') + 1).'/';
echo "<b>$item1</b><table border=1 style='margin-left: 60px; position: static; border: blue'><tr><td>";
read_dir($dir1);
echo "</table>";
else:
$cesta_file = "\"".$dir."/".$item."\"";
$cesta_size = $dir."/".$item;
echo "<span class=pop> <a href=$cesta_file title=$item>$item</a> <span> - ".format($cesta_size)."</span> </span><br>";
endif;
} //endforeach
endif;
}
?>
...
<table><tr><td>
<?php
$dir = ".";
read_dir($dir);
?>
</table>
02-Feb-2006 11: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.
09-Jan-2006 10: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)
09-Jan-2006 10: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
24-Dec-2005 05: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; //all tags were found & replaced.
$endPos = strpos($contents,"/script>",$begPos+strlen("<script"));
$tmp = substr($contents,0,$begPos);
$tmp .= substr($contents,$endPos+strlen("script>"));
$contents = $tmp;
if ($loopcontrol++>100) break; //loop infinity control
continue; //search again
}
return $contents;
}
?>
23-Dec-2005 11: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
23-Nov-2005 01: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
21-Nov-2005 10: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=$be