PHP:相当于MySQL的函数SUBSTRING_INDEX?

时间:2011-07-30 20:28:46

标签: php mysql substring

我喜欢MySQL中的SUBSTRING_INDEX函数,特别是因为您可以使用负索引从字符串的右侧开始搜索。

PHP中是否有这个功能的等价物? (或者通过一些代码轻松实现)

5 个答案:

答案 0 :(得分:15)

没有单一的库函数能够为您提供相同的功能,但您可以获得一个单行程序:

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

答案 1 :(得分:3)

我认为

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
?>

答案 2 :(得分:0)

我很好奇并使用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];
    }
  }
}

答案 3 :(得分:0)

如果仅需要SUBSTRING_INDEX(str,delim,1)的等效项,则可以使用:

list($str,) = explode($delim, $str);

答案 4 :(得分:-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));
    }
}