wake-up-neo.net

Frage zu strpos. Wie bekomme ich das zweite Vorkommen der Zeichenkette?

Ich verstehe, dass diese Funktion das erste Vorkommen der Zeichenfolge erhält.

Was ich aber will, ist das 2. Vorkommen.

Wie mache ich das?

43
vfvg

Sie müssen den Versatz für den Start der Suche als optionalen dritten Parameter angeben und berechnen, indem Sie die Suche direkt nach dem ersten Vorkommen starten, indem Sie die Länge der gesuchten Position zu der Position hinzufügen, an der Sie sie gefunden haben.

$pos1 = strpos($haystack, $needle);
$pos2 = strpos($haystack, $needle, $pos1 + strlen($needle));
46
Sophie Alpert

Ich weiß, dass diese Frage ziemlich alt ist, aber hier ist eine Funktion, die ich geschrieben habe, um das X-te Vorkommen eines Teilstrings zu erhalten, was für andere Leute hilfreich sein kann, die dieses Problem haben und über diesen Thread stolpern.

/**
 * Find the position of the Xth occurrence of a substring in a string
 * @param $haystack
 * @param $needle
 * @param $number integer > 0
 * @return int
 */
function strposX($haystack, $needle, $number){
    if($number == '1'){
        return strpos($haystack, $needle);
    }elseif($number > '1'){
        return strpos($haystack, $needle, strposX($haystack, $needle, $number - 1) + strlen($needle));
    }else{
        return error_log('Error: Value for parameter $number is out of range');
    }
}
45

Die rekursive Funktion von Smokey_Bud verlangsamte mein Skript drastisch. Die Verwendung eines regulären Ausdrucks ist in diesem Fall viel schneller (um ein Vorkommen zu finden):

function strposX($haystack, $needle, $number)
{
    // decode utf8 because of this behaviour: https://bugs.php.net/bug.php?id=37391
    preg_match_all("/$needle/", utf8_decode($haystack), $matches, PREG_OFFSET_CAPTURE);
    return $matches[0][$number-1][1];
}

// get position of second 'wide'
$pos = strposX('Hello wide wide world', 'wide', 2);
10
oncode

Um das zweite Vorkommen des Strings zu finden, können Sie den Parameter strpos zusammen mit dem Parameter "offset" verwenden, indem Sie den vorherigen Offset zu strpos hinzufügen.

$source = "Hello world, how you doing world...world ?";
$find = "world";
$offset = 0;
$findLength = strlen($find);
$occurrence = 0;

while (($offset = strpos($source, $find, $offset))!== false) {
    if ($occurrence ++) {
      break;
    }
    $offset += $findLength; 
}

echo $offset;

Sie können alle Vorkommen finden, indem Sie den Versatz in einem Array speichern

while (($offset = strpos($source, $find, $offset))!== false) {
  $occurrences[] = $offset;
  $offset += $findLength; 
}
var_export($occurrences);

Oder Sie können ein bestimmtes Vorkommen erhalten, indem Sie das Vorkommen von $ zusammenführen 

//find 3rd occurrence
if ($occurrence ++ == 2) {
    break;
}
8
Tofeeq

Sie können es versuchen, obwohl ich es nicht getestet habe-

$pos = strpos($haystack, $needle, strpos($haystack, $needle)+strlen($needle));
7
Sadat

Einfach ist schön

function strposX($haystack, $needle, $n = 0)
{
    $offset = 0;

    for ($i = 0; $i < $n; $i++) {
        $pos = strpos($haystack, $needle, $offset);

        if ($pos !== false) {
            $offset = $pos + strlen($needle);
        } else {
            return false;
        }
    }

    return $offset;
}

$offset = strposX($result, "\n", $n);

if ($offset === false) {
    $offset = strlen($result) - 1;
}
2
tom10271

Alte Frage, aber wenn jemand nach einem Weg sucht, Vorkommen aus dem ENDE des Strings herauszufinden (z. B. 3. Punkt vom Ende), funktioniert die folgende Funktion (die oncodes-Funktion wollte die Kodierung nicht verwenden)

$str = "NooooYesYesNo";

function find_occurence_from_end($haystack, $needle, $num) {

    for ($i=1; $i <=$num ; $i++) {

        # first loop return position of needle
        if($i == 1) {
            $pos = strrpos($haystack, $needle);
        }

        # subsequent loops trim haystack to pos and return needle's new position
        if($i != 1) {

            $haystack = substr($haystack, 0, $pos);
            $pos = strrpos($haystack, $needle);

        }

    }

    return $pos;

}

$pos = find_occurence_from_end($str, "Yes", 2);

// 5

Es ist super einfach. Grundsätzlich wird jedes Mal, wenn ein Nadelvorkommen gefunden wird, die Schnur auf diese Position "zugeschnitten". So wird es immer wieder zugeschnitten und die letzte Position jedes Mal zurückgegeben.

0
Robert Sinclair
function substr_Index( $str, $nth ){
    $str2 = '';
    $posTotal = 0;
    for($i=0; $i < $nth; $i++){

        if($str2 != ''){
            $str = $str2;
        }

        $pos   = strpos($str, ':');
        $str2  = substr($str, $pos+1);
        $posTotal += $pos+1;

    }
    return $posTotal-1;
}


echo substr($mystring, substr_Index( $mystring , 2) );

Funktion gibt die Position des n-ten Begrenzers zurück.

Der zweite Parameter von substr_Index Muss größer als 0 sein.

Um das zweite Vorkommen zu finden, benutze substr_Index( $mystring , 2)

0
Kad

ich arbeitete nur für mich, um herauszufinden, ob es 2 oder mehr Vorkommen eines Zeichens gibt, und dann habe ich festgestellt, dass Vorkommen 2 Vorkommen ex existieren (ich verwende keine $ -Matches).

$string = '1234|6|#red';

if(strlen(preg_match_all('/|/', $string,$matches, PREG_OFFSET_CAPTURE)) ==2){

echo 'i have 2 occurence of char: |';

    }
0
Dan

Mach es einfach:

$i = $pos = 0;    
do {
        $pos = strpos( $string, $needle, $pos+1 );
} while( $i++ < $nth);

$ nth für Ihre Situation ist gleich 2.

0

Alte Frage, aber wie wäre es mit explode?

$corpus = "how many words are there in a dictionary? I'm not going to count them Word by Word...";
$looking_for = 'Word';
$instance = 2;

$parts = explode($looking_for, $corpus, $instance + 1);
array_pop($parts);
$position = strlen(implode($looking_for, $parts));
0
Maarten Wolzak