(PHP 4, PHP 5)
strpos — Sucht das erste Vorkommen des Suchstrings
Gibt die numerische Position des ersten Vorkommens von needle innerhalb der Zeichenkette haystack zurück. Anders als strrpos() vor PHP 5 akzeptiert diese Funktion eine komplette Zeichenkette als needle-Parameter und verwendet den gesamten String zur Suche.
Die Zeichenkette, in der gesucht werden soll.
Ist needle kein String, wird der Parameter in einen Integerwert konvertiert, der dem Ordinalwert des Zeichens entspricht.
Der optionale Parameter offset ermöglicht es Ihnen, die Startposition für die Suche innerhalb von haystack anzugeben. Die zurück gegebene Positions-Angabe ist dann relativ zum Anfang von haystack.
Gibt die Position als Integerwert zurück. Wurde needle nicht gefunden, gibt strpos() den boolean-Wert FALSE zurück.
Diese Funktion kann sowohl das boolsche FALSE zurückliefern, als auch einen nicht-boolschen Wert, wie zum Beispiel 0 oder "", der von einem einfachen if-Statement als FALSE ausgewertet wird. Weitere Informationen entnehmen Sie bitte dem Abschnitt über die boolschen Typen. Benutzen Sie deshalb den === Operator, um den Rückgabewert dieser Funktion zu überprüfen.
Beispiel #1 Verwendung von ===
<?php
$meinString = 'abc';
$findMich = 'a';
$pos = strpos($meinString, $findMich);
// Beachten Sie die Verwendung von ===. Ein einfacher Vergleich (==) liefert
// nicht das erwartete Ergebnis, da die Position von 'a' die nullte Stelle
// (also das erste Zeichen) ist
if ($pos === false) {
echo "Der String '$findMich' wurde nicht im String '$meinString' gefunden";
} else {
echo "Der String '$findMich' wurde im String '$meinString' gefunden";
echo " und befindet sich an Position $pos";
}
?>
Beispiel #2 Verwendung von !==
<?php
$meinString = 'abc';
$findMich = 'a';
$pos = strpos($meinString, $findMich);
// Der !==-Operator kann ebenfalls verwendet werden. Die Verwendung von != von
// != würde in unserem Beispiel nicht wie erwartet arbeiten, da die Position
// von 'a' 0 ist. Das Statement (0 != false) evaluiert hierbei zu false.
if ($pos !== false) {
echo "Der String '$findMich' wurde im String '$meinString' gefunden";
echo " und befindet sich an Position $pos";
} else {
echo "Der String '$findMich' wurde nicht im String '$meinString' gefunden";
}
?>
Beispiel #3 Verwendung eines Offsets
<?php
// Wir koennen nach einem Zeichen suchen und dabei alles vor dem Offset ignorieren
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, nicht 0
?>
Hinweis: Diese Funktion ist binary safe.
beware the mindless "if needle is not string" :
root@voice1:/www/voice_ed#php -r 'var_dump(strpos("X1234567",5));'
bool(false)
root@voice1:/www/voice_ed#php -r 'var_dump(strpos("X1234567","5"));'
int(5)
root@voice1:/www/voice_ed#
<?php
$my_array = array ('100,101', '200,201', '300,301');
$check_me_in = array ('100','200','300','400');
foreach ($check_me_in as $value_cmi){
$is_in=FALSE; #asume that $check_me_in isn't in $my_array
foreach ($my_array as $value_my){
$pos = strpos($value_my, $value_cmi);
if ($pos===0)
$pos++;
if ($pos==TRUE){
$is_in=TRUE;
$value_my2=$value_my;
}
}
if ($is_in) echo "ID $value_cmi in \$check_me_in I found in value '$value_my2' \n";
}
?>
The above example will output
ID 100 in $check_me_in I found in value '100,101'
ID 200 in $check_me_in I found in value '200,201'
ID 300 in $check_me_in I found in value '300,301'
Parse strings between two others in to array.
<?php
function g($string,$start,$end){
preg_match_all('/' . preg_quote($start, '/') . '(.*?)'. preg_quote($end, '/').'/i', $string, $m);
$out = array();
foreach($m[1] as $key => $value){
$type = explode('::',$value);
if(sizeof($type)>1){
if(!is_array($out[$type[0]]))
$out[$type[0]] = array();
$out[$type[0]][] = $type[1];
} else {
$out[] = $value;
}
}
return $out;
}
print_r(g('Sample text, [/text to extract/] Rest of sample text [/WEB::http://google.com/] bla bla bla. ','[/','/]'));
?>
results:
Array
(
[0] => text to extract
[WEB] => Array
(
[0] => http://google.com
)
)
Can be helpfull to custom parsing :)
strpos that accepts an array for $needle
<?php
// strpos that takes an array of values to match against a string
// note the stupid argument order (to match strpos)
function strpos_arr($haystack, $needle) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $what) {
if(($pos = strpos($haystack, $what))!==false) return $pos;
}
return false;
}
?>
I found that whatever I was using as a test with strpos it came out false exept if $pos was == 1
I figured it gives me a numeric value if found else it is null or false
here is what i did to make my code work:
<?php
//EXAMPLE 1:
$quiamime = ',64,68,70,';
$me = '64'
$posi = strpos($quiaime, ",$me,"); //posi is equal to 0
if (!is_numeric($posi)){
//code here
}else{
//else code here
}
//EXAMPLE 2:
$quiamime = ',68,70,64,';
$me = '64'
$posi = strpos($quiaime, ",$me,"); //posi is equal to 6
if (!is_numeric($posi)){
//code here
}else{
//else code here
}
//EXAMPLE 3:
$quiamime = ',68,70,';
$me = '64'
$posi = strpos($quiaime, ",$me,"); //posi is equal to NULL or FALSE
if (!is_numeric($posi)){
//code here
}else{
//else code here
}
?>
restaurant.nl may find it bizarre, but I prefer this implementation of strnpos because it doesn't give visible warnings when supplied with a needle of length 0 (which is, admittedly, non-standard behavior), AND it's faster...
<?php
/**
* Returns the position of the $nth occurrence of $needle in $haystack, or false if it doesn't exist, or false when illegal parameters have been supplied.
*
* @param string $haystack the string to search in.
* @param string $needle the string to search for.
* @param integer $nth the number of the occurrence to look for.
* @param integer $offset the position in $haystack to start looking for $needle.
* @return MIXED integer either the position of the $nth occurrence of $needle in $haystack,
* or boolean false if it can't be found.
*/
function strnpos( $haystack, $needle, $nth, $offset = 0 )
{
if( 1 > $nth || 0 === strlen( $needle ) )
{
return false;
}
// $offset is incremented in the call to strpos, so make sure that the first call starts at the right position by initially decrementing $offset.
--$offset;
do
{
$offset = strpos( $haystack, $needle, ++ $offset );
} while( --$nth && false !== $offset );
return $offset;
}
?>
I've seen some awful and even outright bizarre examples for finding the nth occurrence of needle inside haystack starting at a given offset,
so here's what I believe is a better one:
<?php
function strnpos($haystack, $needle, $nth, $offset = 0)
{
for ($retOffs=$offset-1; ($nth>0)&&($retOffs!==FALSE); $nth--) $retOffs = strpos($haystack, $needle, $retOffs+1);
return $retOffs;
}
echo strnpos("who's your daddy, daddy?", "d", 1); // 11
echo strnpos("who's your daddy, daddy?", "d", 3); // 14
echo strnpos("who's your daddy, daddy?", "d", 2, 14); // 18
echo strnpos("who's your daddy, daddy?", "daddy", 2); // 18
?>
enjoy
Dan Brown and I had a discussion on the PHP list about the speed difference between the popular three string searching techniques. He wrote a simple timing test, and I adapted it further. The end result is that all three are very close and not even noticeable for sets < 1M. Although, technically strpos() is about twice as fast (as the docs allude to above). Here it is for your own amusement and testing purposes.
<?php
for ($i = 0; $i < 1000000; $i++ )
$o[] =
sprintf('%04d-%02d-%02d',rand(0000,9999),rand(00,99),rand(00,99));
#print_r($o);
echo "array of ".number_format($i)."\n";
###################################################################
$now = microtime(true);
for($i=0;$i<count($o);$i++) {
if(preg_match('/^[0]{4,}\-/U',$o[$i])) {
//echo "Offset #".$i." matches: ".$o[$i].PHP_EOL;
}
}
$rank['preg_match'] = (microtime(true) - $now);
###################################################################
$later = microtime(true);
for($i=0;$i<count($o);$i++) {
if(substr($o[$i],0,4) == "0000") {
//echo "Offset #".$i." matches: ".$o[$i].PHP_EOL;
}
}
$rank['substr'] = (microtime(true) - $later);
###################################################################
$after = microtime(true);
for($i=0;$i<count($o);$i++) {
if(strpos($o[$i], '0000') === 0) {
//echo "Offset #".$i." matches: ".$o[$i].PHP_EOL;
}
}
$rank['strpos'] = (microtime(true) - $after);
###################################################################
asort($rank);
print_r($rank);
?>
array of 10,000
Array
(
[strpos] => 0.00766682624817
[substr] => 0.0116670131683
[preg_match] => 0.0124950408936
)
array of 100,000
Array
(
[strpos] => 0.0817799568176
[substr] => 0.120522975922
[preg_match] => 0.125612974167
)
array of 1,000,000
Array
(
[strpos] => 0.805890083313
[substr] => 1.19799995422
[preg_match] => 1.25615906715
)
I ran out of memory with more than 1M array elements.
A function I made to find the first occurrence of a particular needle not enclosed in quotes(single or double). Works for simple nesting (no backslashed nesting allowed).
<?php
function strposq($haystack, $needle, $offset = 0){
$len = strlen($haystack);
$charlen = strlen($needle);
$flag1 = false;
$flag2 = false;
for($i = $offset; $i < $len; $i++){
if(substr($haystack, $i, 1) == "'"){
$flag1 = !$flag1 && !$flag2 ? true : false;
}
if(substr($haystack, $i, 1) == '"'){
$flag2 = !$flag1 && !$flag2 ? true : false;
}
if(substr($haystack, $i, $charlen) == $needle && !$flag1 && !$flag2){
return $i;
}
}
return false;
}
echo strposq("he'llo'character;\"'som\"e;crap", ";"); //16
?>
This function finds postion of nth occurence of a letter starting from offset.
<?php
function nth_position($str, $letter, $n, $offset = 0){
$str_arr = str_split($str);
$letter_size = array_count_values(str_split(substr($str, $offset)));
if( !isset($letter_size[$letter])){
trigger_error('letter "' . $letter . '" does not exist in ' . $str . ' after ' . $offset . '. position', E_USER_WARNING);
return false;
} else if($letter_size[$letter] < $n) {
trigger_error('letter "' . $letter . '" does not exist ' . $n .' times in ' . $str . ' after ' . $offset . '. position', E_USER_WARNING);
return false;
}
for($i = $offset, $x = 0, $count = (count($str_arr) - $offset); $i < $count, $x != $n; $i++){
if($str_arr[$i] == $letter){
$x++;
}
}
return $i - 1;
}
echo nth_position('foobarbaz', 'a', 2); //7
echo nth_position('foobarbaz', 'b', 1, 4); //6
?>
This functions throws an "Offset not contained in string" error if the offset is not in between 0 and the length of string.
The following function use to redirect to URL correctly if the URL have "http://" or "https://", or to relative URL on your site.
<?php
function forward($url = NULL){
$root = "http://example.com/mydir/";
if($url == NULL) // Go to homepage
$url = $root;
else {
$pos = strpos($url, "http://");
if ($pos === false)
$pos = strpos($url, "https://");
if ($pos === false || $pos > 0) // Go to relative URL on your site
$url = $root . $url;
}
header('Location:'.$url);
}
?>
Function to get the string pos ($search), before the position ($pos) passed as parameter.
<?php
function strposReverse( $str, $search, $pos ){
$str = strrev($str);
$search = strrev($search);
$pos = (strlen($str) - 1) - $pos;
$posRev = strpos( $str, $search, $pos );
return (strlen($str) - 1) - $posRev - (strlen($search) - 1);
}
?>
A strpos modification to return an array of all the positions of a needle in the haystack
<?php
function strallpos($haystack,$needle,$offset = 0){
$result = array();
for($i = $offset; $i<strlen($haystack); $i++){
$pos = strpos($haystack,$needle,$i);
if($pos !== FALSE){
$offset = $pos;
if($offset >= $i){
$i = $offset;
$result[] = $offset;
}
}
}
return $result;
}
?>
example:-
<?php
$haystack = "ASD is trying to get out of the ASDs cube but the other ASDs told him that his behavior will destroy the ASDs world";
$needle = "ASD";
print_r(strallpos($haystack,$needle));
//getting all the positions starting from a specified position
print_r(strallpos($haystack,$needle,34));
?>
I found in a certain bit of my code that under certain circumstances, $needle could be an empty string. This caused strpos to generate an error message.
To get round it, I had to first test to see if $needle was an empty string, and then (ie 'else') go forward and do the strpos test if not.
This function find position of first occurrence of any $needles in a string $haystack.
Return the position as an integer. If needles is not found, strposa() will return boolean FALSE.
<?php
function strposa($haystack ,$needles=array(),$offset=0){
$chr = array();
foreach($needles as $needle){
$chr[] = strpos($haystack,$needle,$offset);
}
if(empty($chr)) return false;
return min($chr);
}
$string = "This is my string, very simple.";
echo strposa($string,array(".",","," ")); // 2
echo strposa($string,array("T")); // 0
echo strposa($string,array("Q","W")); // false
?>
Note that strpos() will return false if you supply an integer (thus, this presumably applies to float, too) as needle. For example:
<?php
$id = 2; $text = '12345';
if(strpos($text, $id) === false){
echo 'Yes, is false';
}
?>
Will output 'Yes, is false', a behavior which may not be very intuitive (you'd think it would be covered by PHP's type juggling feature).
This can be easily fixed by adding $id = (string)$id; above the strpos() statement.
routine to return -1 if there is no match for strpos
<?php
//instr function to mimic vb instr fucntion
function InStr($haystack, $needle)
{
$pos=strpos($haystack, $needle);
if ($pos !== false)
{
return $pos;
}
else
{
return -1;
}
}
?>
A function that return the first occurance of a number in a string, if anyone needs it.
Translation/prevod:
Funkcija, ki vrača pozicijo prve številke v besedi, če jo kdo potrebuje.
<?php
function firstNumPos($str) {
$poses = array(); // will be storing positions of the numbers
for($i = 0; $i < 10; ++$i) { // cycle through numbers
if(($a = strpos($str, (string)$i)) !== false) {
$poses[] = $a; // append the position of
// the first occurance of the number
}
}
if(isset($poses[0])) { // if array not empty
sort($poses); // sort to get the lowest one on the 'bottom'
return $poses[0]; // and return it
}
return false; // otherwise return false
} // firstNumPos()
?>
The Situation:
I wanted to return TRUE if strpos returned position 0, and only position 0, without the added overhead of preg_match.
The Solution:
As PHP treats 0 (zero) as NULL, and strpos returns the int 0 (but not NULL), I used type casting and the "===" comparison operator (as it compares types) to resolve my issue.
<?php
$hayStack = "dbHost";
$needle = "db"
$needlePos = strpos($hayStack, $needle);
if((string)$needlePos === (string)0) {
echo "db is in position zero";
} else {
echo "db is NOT in position zero";
}
?>
Returns:
db is in position zero
<?php
$hayStack = "another_db_host";
$needle = "db"
$needlePos = strpos($hayStack, $needle);
if((string)$needlePos === (string)0) {
echo "db is in position zero";
} else {
echo "db is NOT in position zero";
}
?>
This returns:
db is in NOT position zero
If you would like to find all occurences of a needle inside a haystack you could use this function strposall($haystack,$needle);. It will return an array with all the strpos's.
<?php
/**
* strposall
*
* Find all occurrences of a needle in a haystack
*
* @param string $haystack
* @param string $needle
* @return array or false
*/
function strposall($haystack,$needle){
$s=0;
$i=0;
while (is_integer($i)){
$i = strpos($haystack,$needle,$s);
if (is_integer($i)) {
$aStrPos[] = $i;
$s = $i+strlen($needle);
}
}
if (isset($aStrPos)) {
return $aStrPos;
}
else {
return false;
}
}
?>
careful that when you put a strpos in an if statement that you take note that if the string is in the 0 position it will return false, causing your control structure to think its not in the string.
This is the code,I wrote today, I wanted to strip all the newlines, and format the output in a single line so as to lower the filesize of my php source files.
<?php
/****************************************
@ Code By : Samundra Shrestha
@ Dated : September 28,2008
P.S. Remember to remove all single line comments from the source file
otherwise the file may get corrupted.
******************************************/
if(!isset($_POST['change']) || !isset($_POST['filename']))
{
print "<b>".strtoupper("Paste the fullpath of the file")."</b>";
print "<form name='FrmChange' method='post' action='".$_SERVER['PHP_SELF']."'>";
print "<input type='textbox' name='filename' size='50px' maxlength='255'>";
print "<input type='submit' name='change' value='Start'>";
print "</form>";
}
else
{
$filename=$_POST['filename'];
if(!$fpin=@fopen($filename,"r"))
{
print "<b>Error ! File Doesn't Exists</b>";
exit();
}
$text="";
$i=0;
/*Put the contents of file into the string*/
while(!feof($fpin))
{
$text.=fread($fpin,1024);
}
$count=strlen($text);
$pos=strpos($text,"\n"); //Gives the First occurence of newline
while($i<$count)
{
if($i<$pos-1)
{
$newtext.=$text{$i}; //C Style of String Indexing
}
else
{
$pos=strpos($text,"\n",$i+1);
}
$i++;
}
$newtext.="?>"; //necessary as somehow it is removed from the original source file.
$fp=fopen("sample.txt","wb+");
fwrite($fp,$newtext);
fclose($fp);
print "File Changed Successfully.";
}
?>
The resultant code is all in one new line saved in file sample.txt
I hope, this comes handy to someone.
Cheers,
Samundra Shrestha
http://www.samundra.com.np
here's a php implementation of stdc++ string class find_first_of using strpos.
<?php
function find_first_of($haystack, $needlesAsString, $offset=0)
{
$max = strlen($needlesAsString);
$index = strlen($haystack)+1;
for($ii=0; $ii<$max;$ii++){
$result = strpos($haystack,$needlesAsString[$ii], $offset);
if( $result !== FALSE && $result < $index)
$index = $result;
}
return ( $index > strlen($haystack)? FALSE: $index);
}
?>
Example:
<?php
$test="Ralph: One of these days, Alice!!";
$look_for=":!,"; // punctuation marks
$ss = 0;
while( $answer=find_first_of($test,$look_for,$ss) ) {
echo $answer . "\n";
$ss = $answer+1;
}
?>
This prints out:
5
24
31
32
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!
I wasn't aware of the !== operator, only the === for false. I was using this code on strpos:
<?php
while( ! ($start=@strpos($source,$startTag,$end)) === false) {
// ...
}
?>
This gave a false if the string was found at position 0, which is weird.
However using
<?php
while(($start=@strpos($source,$startTag,$end)) !== false) {
// ...
}
?>
Gives no such error and seems to work correctly
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;
}
?>
This might be useful.
<?php
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
?>
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.
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);
}
?>
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);
?>
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.
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;
}
?>
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, " "));
?>
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;
}
?>
this function returns the text between 2 strings:
<?php
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.
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;
}
?>
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];
}
?>
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;
}
//
}
?>
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)...
<?php
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.
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;
}
?>
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;
}
?>
If you want to find positions of all needle's in haystack,
you can use this one:
<?php
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.
<?php
$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
<?php
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
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;
}
?>
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.
<?php
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)
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:
<?php
function strposnth($haystack, $needle, $nth=1, $insenstive=0)
{
//if its case insenstive, convert strings into lower case
if ($insenstive) {
$haystack=strtolower($haystack);
$needle=strtolower($needle);
}
//count number of occurances
$count=substr_count($haystack,$needle);
//first check if the needle exists in the haystack, return false if it does not
//also check if asked nth is within the count, return false if it doesnt
if ($count<1 || $nth > $count) return false;
//run a loop to nth number of accurance
for($i=0,$pos=0,$len=0;$i<$nth;$i++)
{
//get the position of needle in haystack
//provide starting point 0 for first time ($pos=0, $len=0)
//provide starting point as position + length of needle for next time
$pos=strpos($haystack,$needle,$pos+$len);
//check the length of needle to specify in strpos
//do this only first time
if ($i==0) $len=strlen($needle);
}
//return the number
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
<?php
//get the product description from recordset
$text=$row['product_desc'];
//strip off text if its longer than 100 characters
if (strlen($text)>100) $text=substr($text,0,100)." ...";
//get ending of the third line
$pos=strposnth($text,"\n",3,1);
//if found, strip off text after that
if($pos) $text=substr($text,0,$pos);
//nl2li (new line 2 list) this function converts the \n seprated lines of text into sorted or unsorted lists
//I have posted this function in nl2br
//http://uk2.php.net/manual/en/function.nl2br.php
$text=nl2li($text);
echo $text;
?>
Examples:
<?php
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)
?>
Regards,
webKami [at] akdomains.com
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.
<?php
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;
}
?>
I created a useful function that returns an array with the positions within a string. For more info, read the comments:
<?php
// Returns an array in this fashion:
// array(count => position)
function strpos_array($haystack, $needle){
$kill = 0; // Kills while loop when changed
$offset = 0; // Offset for strpos()
$i = 0; // Counter, not iterator
while ($kill === 0) {
$i++;
$result = strpos($haystack, $needle, $offset);
if ($result === FALSE) { // If result is false (no more instances found), kill the while loop
$kill = 1;
} else {
$array[$i] = $result; // Set array
$offset = $result + 1; // Offset is set 1 character after previous occurence
}
}
return $array;
}
?>
here a little function for tag parsing
<?php
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;
}
?>
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;
}
}
?>
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
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
// simplest use
if (str_contains('this is a test', 'is')) {
echo "Found it";
}
// when you need the position, as well whether it's present
$needlePos = str_contains('this is a test', 'is');
if ($needlePos) {
echo 'Found it at position ' . ($needlePos-1);
}
// you may also ignore case
$needlePos = str_contains('this is a test', 'IS', true);
if ($needlePos) {
echo 'Found it at position ' . ($needlePos-1);
}
?>
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);
}
?>
counting the occurrences of a substring, recursive-style instead of looping.
<?php
function countSubstrs($haystack, $needle)
{
return (($p = strpos($haystack, $needle)) === false) ? 0 : (1 + countSubstrs(substr($haystack, $p+1), $needle));
}
?>
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);
}
?>
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; // Used if pos_as_key is false
// Convert full text to lower case to make this case insensitive
$haystack = strtolower($haystack);
// Split keywords and lowercase them
foreach ( preg_split('/[^\w]/',strtolower($needles)) as $needle )
{
// Get all occurences of this keyword
$i=0; $pos_cur=0; $pos_found=0;
while ( $pos_found !== false && $needles !== '')
{
// Get the strpos of this keyword (if thereis one)
$pos_found = strpos(substr($haystack,$pos_cur),$needle);
if ( $pos_found !== false )
{
// Set up key for main array
$index = $pos_as_key ? $pos_found+$pos_cur : $idx++;
// Populate main array with this keywords positional data
$positions[$index]['start'] = $pos_found+$pos_cur;
$pos_cur += ($pos_found+strlen($needle));
$positions[$index]['end'] = $pos_cur;
$positions[$index]['word'] = $needle;
$i++;
}
}
}
// If we found anything then sort the array and return it
if ( isset($positions) )
{
ksort($positions);
return $positions;
}
// If nothign was found then return false
return false;
}
?>