2011-07-30 12 views
6

Uwielbiam funkcję SUBSTRING_INDEX w MySQL, szczególnie, że można użyć indeksów ujemnych, aby rozpocząć wyszukiwanie od prawej strony ciągu znaków.PHP: odpowiednik funkcji SUBSTRING_INDEX MySQL?

Czy istnieje odpowiednik tej funkcji w PHP? (Lub w prosty sposób to zrobić z kawałkiem kodu)

+3

Dla tych myśli 'substr' przeczytać definicję [' SUBSTRING_INDEX'] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index) –

Odpowiedz

14

Nie ma funkcja pojedyncza biblioteka, która dostaje tę samą funkcjonalność, ale można dostać jedno-liner:

$str = "www.mysql.com"; 
echo implode('.', array_slice(explode('.', $str), 0, 2)); // prints "www.mysql" 
echo implode('.', array_slice(explode('.', $str), -2)); // prints "mysql.com" 

łatwo przekształcić to pod funkcja:

function substring_index($subject, $delim, $count){ 
    if($count < 0){ 
     return implode($delim, array_slice(explode($delim, $subject), $count)); 
    }else{ 
     return implode($delim, array_slice(explode($delim, $subject), 0, $count)); 
    } 
} 
-2
function substring_index($subject, $delim, $count){ 
    if($count < 0){ 
     return implode($delim, array_slice(explode($delim, $subject), $count)); 
    }else{ 
     return implode($delim, array_slice(explode($delim, $subject), 0, $count)); 
    } 
} 
3

myślę

string strstr (string $haystack , mixed $needle [, bool $before_needle = false ]) 

to odpowiednia funkcja php.

strstr - Znajduje pierwsze wystąpienie łańcucha

<?php 
$email = '[email protected]'; 
$domain = strstr($email, '@'); 
echo $domain; // prints @example.com 

$user = strstr($email, '@', true); // As of PHP 5.3.0 
echo $user; // prints name 
?> 
0

byłem ciekaw i przetestowany przy użyciu innej metody konfiguracji preg/mecz, następnie refactored go aby umożliwić dowolnej liczby ograniczników/liczyć. Dodałem podczas sprawdzania liczby, że inny przykład był używany, ale prawdopodobnie zaleciłbym także pewien rodzaj odkażania pola ogranicznika.

function substring_index($subject, $delim, $count){ 
    if($count < 0){ 
    $notRe = '[^\\'.$delim.']*'; 
    $elem = array(); 
    for($x=1;$x<=$count;$x++){ 
     array_push($elem,$notRe); 
    } 
    $re = '/^('.implode('\\'.$delim,$elem).')/'; 
    preg_match($re, $subject,$m); 
    if(count($m) == 2) { 
     return $m[1]; 
    } 
    } 
}