PHP: эквивалент функции MySQL SUBSTRING_INDEX?

Мне нравится функция SUBSTRING_INDEX в MySQL, особенно потому, что вы можете использовать отрицательные индексы для начала поиска с правой стороны строки.

Есть ли эквивалент этой функции в PHP? (или простой способ сделать это с небольшим количеством кода)

Там нет единой библиотечной функции, которая дает вам эту же функциональность, но вы можете получить однострочный:

 $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" 

Легко превратить это в функцию:

 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)); } } 

я думаю

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

это правильная функция php для вас.

strstr – находит первое вхождение строки

 <?php $email = 'name@example.com'; $domain = strstr($email, '@'); echo $domain; // prints @example.com $user = strstr($email, '@', true); // As of PHP 5.3.0 echo $user; // prints name ?> 

Мне было любопытно и протестирован другой метод, используя настройку preg / match, а затем реорганизовал его, чтобы разрешить любое количество разделителей / счетчиков. Я добавил в счетчик проверки другой пример, но я бы, вероятно, также рекомендовал какую-то дезинфекцию поля разделителя.

 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]; } } } 
 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)); } }