Мне нравится функция 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)); } }