Мне нужна функция, которая возвращает подстроку между двумя словами (или двумя символами). Мне интересно, есть ли функция php, которая этого добивается. Я не хочу думать о регулярном выражении (ну, я мог бы сделать его, но на самом деле не думаю, что это лучший способ). Думая strpos
и substr
функции. Вот пример:
$string = "foo I wanna a cake foo";
Мы вызываем функцию: $substring = getInnerSubstring($string,"foo");
она возвращает: «Я хочу торт».
Заранее спасибо.
Обновление:
Ну, до сих пор я могу просто получить подстроку из двух слов всего в одной строке, вы разрешите мне пойти немного дальше и спросить, могу ли я расширить использование, getInnerSubstring($str,$delim)
чтобы получить любые строки, которые находятся между значением разделителя, пример:
$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero foo";
Я получаю массив вроде {"I like php", "I also like asp", "I feel hero"}
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
это удобно. laravel.com/docs/7.x/helpers#method-str-betweenОтветы:
Если строки разные (например: [foo] и [/ foo]), взгляните на этот пост от Джастина Кука. Копирую его код ниже:
function get_string_between($string, $start, $end){ $string = ' ' . $string; $ini = strpos($string, $start); if ($ini == 0) return ''; $ini += strlen($start); $len = strpos($string, $end, $ini) - $ini; return substr($string, $ini, $len); } $fullstring = 'this is my [tag]dog[/tag]'; $parsed = get_string_between($fullstring, '[tag]', '[/tag]'); echo $parsed; // (result = dog)
источник
Регулярные выражения - это лучший способ:
$str = 'before-str-after'; if (preg_match('/before-(.*?)-after/', $str, $match) == 1) { echo $match[1]; }
onlinePhp
источник
function getBetween($string, $start = "", $end = ""){ if (strpos($string, $start)) { // required if $start not exist in $string $startCharCount = strpos($string, $start) + strlen($start); $firstSubStr = substr($string, $startCharCount, strlen($string)); $endCharCount = strpos($firstSubStr, $end); if ($endCharCount == 0) { $endCharCount = strlen($firstSubStr); } return substr($firstSubStr, 0, $endCharCount); } else { return ''; } }
Пример использования:
echo getBetween("abc","a","c"); // returns: 'b' echo getBetween("hello","h","o"); // returns: 'ell' echo getBetween("World","a","r"); // returns: ''
источник
function getInnerSubstring($string,$delim){ // "foo a foo" becomes: array(""," a ","") $string = explode($delim, $string, 3); // also, we only need 2 items at most // we check whether the 2nd is set and return it, otherwise we return an empty string return isset($string[1]) ? $string[1] : ''; }
Пример использования:
var_dump(getInnerSubstring('foo Hello world foo','foo')); // prints: string(13) " Hello world "
Если вы хотите удалить окружающие пробелы, используйте
trim
. Пример:var_dump(trim(getInnerSubstring('foo Hello world foo','foo'))); // prints: string(11) "Hello world"
источник
function getInbetweenStrings($start, $end, $str){ $matches = array(); $regex = "/$start([a-zA-Z0-9_]*)$end/"; preg_match_all($regex, $str, $matches); return $matches[1]; }
$str = "C://@@ad_custom_attr1@@/@@upn@@/@@samaccountname@@"; $str_arr = getInbetweenStrings('@@', '@@', $str); print_r($str_arr);
источник
дважды используйте функцию strstr php.
$value = "This is a great day to be alive"; $value = strstr($value, "is"); //gets all text from needle on $value = strstr($value, "be", true); //gets all text before needle echo $value;
выходы:
"is a great day to"
источник
Мне нравятся решения с регулярными выражениями, но все остальные мне не подходят.
Если вы знаете, что будет только 1 результат, вы можете использовать следующее:
$between = preg_replace('/(.*)BEFORE(.*)AFTER(.*)/sm', '\2', $string);
Измените ДО и ПОСЛЕ на желаемые разделители.
Также имейте в виду, что эта функция вернет всю строку, если ничего не найдено.
Это решение является многострочным, но вы можете поиграть с модификаторами в зависимости от ваших потребностей.
источник
Не специалист по PHP. но недавно я тоже столкнулся с этой стеной, и это то, что я придумал.
function tag_contents($string, $tag_open, $tag_close){ foreach (explode($tag_open, $string) as $key => $value) { if(strpos($value, $tag_close) !== FALSE){ $result[] = substr($value, 0, strpos($value, $tag_close));; } } return $result; } $string = "i love cute animals, like [animal]cat[/animal], [animal]dog[/animal] and [animal]panda[/animal]!!!"; echo "<pre>"; print_r(tag_contents($string , "[animal]" , "[/animal]")); echo "</pre>"; //result Array ( [0] => cat [1] => dog [2] => panda )
источник
Если вы используете
foo
в качестве разделителя, посмотрите наexplode()
источник
<?php function getBetween($content,$start,$end){ $r = explode($start, $content); if (isset($r[1])){ $r = explode($end, $r[1]); return $r[0]; } return ''; } ?>
Пример:
<?php $content = "Try to find the guy in the middle with this function!"; $start = "Try to find "; $end = " with this function!"; $output = getBetween($content,$start,$end); echo $output; ?>
Это вернет «парня посередине».
источник
Если у вас есть несколько повторений из одной строки и у вас разные шаблоны [начало] и [\ конец]. Вот функция, которая выводит массив.
function get_string_between($string, $start, $end){ $split_string = explode($end,$string); foreach($split_string as $data) { $str_pos = strpos($data,$start); $last_pos = strlen($data); $capture_len = $last_pos - $str_pos; $return[] = substr($data,$str_pos+1,$capture_len); } return $return; }
источник
Вот функция
function getInnerSubstring($string, $boundstring, $trimit=false) { $res = false; $bstart = strpos($string, $boundstring); if ($bstart >= 0) { $bend = strrpos($string, $boundstring); if ($bend >= 0 && $bend > $bstart) $res = substr($string, $bstart+strlen($boundstring), $bend-$bstart-strlen($boundstring)); } return $trimit ? trim($res) : $res; }
Используйте это как
$string = "foo I wanna a cake foo"; $substring = getInnerSubstring($string, "foo"); echo $substring;
Вывод (обратите внимание, что он возвращает пробелы перед и в строке и, если они существуют)
Если вы хотите обрезать результат, используйте такую функцию, как
$substring = getInnerSubstring($string, "foo", true);
Результат : эта функция вернет false, если
$boundstring
не была найдена$string
или$boundstring
существует только один раз, в$string
противном случае она вернет подстроку между первым и последним вхождениями$boundstring
in$string
.Ссылки
источник
IF
пункте ты говоришь? возможно, я допустил опечатку, но, честно говоря, сейчас я не вижу ничего странного. ОбаIF
s, которые я использовал в функции выше, имеют правильные скобки, окружающие условие. Во-первых,IF
также есть фигурные скобки (скобки), которые окружают блок из 2 строк, во 2-мIF
они не нужны, потому что это однострочный код. Что мне не хватает?Улучшение ответа Алехандро . Вы можете оставить аргументы
$start
или$end
пустыми, и они будут использовать начало или конец строки.echo get_string_between("Hello my name is bob", "my", ""); //output: " name is bob" private function get_string_between($string, $start, $end){ // Get if($start != ''){ //If $start is empty, use start of the string $string = ' ' . $string; $ini = strpos($string, $start); if ($ini == 0) return ''; $ini += strlen($start); } else{ $ini = 0; } if ($end == '') { //If $end is blank, use end of string return substr($string, $ini); } else{ $len = strpos($string, $end, $ini) - $ini; //Work out length of string return substr($string, $ini, $len); } }
источник
Использование:
<?php $str = "...server daemon started with pid=6849 (parent=6848)."; $from = "pid="; $to = "("; echo getStringBetween($str,$from,$to); function getStringBetween($str,$from,$to) { $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str)); return substr($sub,0,strpos($sub,$to)); } ?>
источник
Немного улучшенный код от GarciaWebDev и Henry Wang. Если задано пустое значение $ start или $ end, функция возвращает значения от начала или до конца строки $. Также доступна опция включения, независимо от того, хотим ли мы включить результат поиска или нет:
function get_string_between ($string, $start, $end, $inclusive = false){ $string = " ".$string; if ($start == "") { $ini = 0; } else { $ini = strpos($string, $start); } if ($end == "") { $len = strlen($string); } else { $len = strpos($string, $end, $ini) - $ini;} if (!$inclusive) { $ini += strlen($start); } else { $len += strlen($end); } return substr($string, $ini, $len); }
источник
Я должен кое-что добавить к посту Юлиуса Тильвикаса. Я искал решение, подобное тому, которое он описал в своем посте. Но я думаю, что это ошибка. Я действительно не получаю строку между двумя строками, я также получаю больше с этим решением, потому что мне нужно вычесть длину начальной строки. Когда это сделаю, я действительно получаю строку между двумя строками.
Вот мои изменения его решения:
function get_string_between ($string, $start, $end, $inclusive = false){ $string = " ".$string; if ($start == "") { $ini = 0; } else { $ini = strpos($string, $start); } if ($end == "") { $len = strlen($string); } else { $len = strpos($string, $end, $ini) - $ini - strlen($start);} if (!$inclusive) { $ini += strlen($start); } else { $len += strlen($end); } return substr($string, $ini, $len); }
Greetz
V
источник
Попробуйте это, это работает для меня, получите данные между тестовыми словами.
$str = "Xdata test HD01 test 1data"; $result = explode('test',$str); print_r($result); echo $result[1];
источник
В
strpos
стиле PHP это вернется,false
если начальнаяsm
или конечная меткаem
не найдены.Этот result (
false
) отличается от пустой строки, которую вы получаете, если между начальной и конечной метками нет ничего.function between( $str, $sm, $em ) { $s = strpos( $str, $sm ); if( $s === false ) return false; $s += strlen( $sm ); $e = strpos( $str, $em, $s ); if( $e === false ) return false; return substr( $str, $s, $e - $s ); }
Функция вернет только первое совпадение.
Очевидно, но стоит отметить, что функция сначала ищет,
sm
а затем ищетem
.Это означает, что вы можете не получить желаемый результат / поведение, если
em
сначала нужно выполнить поиск, а затем строку нужно проанализировать в обратном направлении в поискахsm
.источник
Это функция, которую я использую для этого. Я объединил два ответа в одну функцию для одного или нескольких разделителей.
function getStringBetweenDelimiters($p_string, $p_from, $p_to, $p_multiple=false){ //checking for valid main string if (strlen($p_string) > 0) { //checking for multiple strings if ($p_multiple) { // getting list of results by end delimiter $result_list = explode($p_to, $p_string); //looping through result list array foreach ( $result_list AS $rlkey => $rlrow) { // getting result start position $result_start_pos = strpos($rlrow, $p_from); // calculating result length $result_len = strlen($rlrow) - $result_start_pos; // return only valid rows if ($result_start_pos > 0) { // cleanying result string + removing $p_from text from result $result[] = substr($rlrow, $result_start_pos + strlen($p_from), $result_len); }// end if } // end foreach // if single string } else { // result start point + removing $p_from text from result $result_start_pos = strpos($p_string, $p_from) + strlen($p_from); // lenght of result string $result_length = strpos($p_string, $p_to, $result_start_pos); // cleaning result string $result = substr($p_string, $result_start_pos+1, $result_length ); } // end if else // if empty main string } else { $result = false; } // end if else return $result; } // end func. get string between
Для простого использования (возвращает два):
$result = getStringBetweenDelimiters(" one two three ", 'one', 'three');
Чтобы получить каждую строку в таблице в массив результатов:
$result = getStringBetweenDelimiters($table, '<tr>', '</tr>', true);
источник
я использую
if (count(explode("<TAG>", $input))>1){ $content = explode("</TAG>",explode("<TAG>", $input)[1])[0]; }else{ $content = ""; }
Подзаголовок <TAG> для любого разделителя, который вы хотите.
источник
отредактированная версия того, что поставил Алехандро Гарсиа Иглесиас.
Это позволяет вам выбрать конкретное местоположение строки, которую вы хотите получить, в зависимости от того, сколько раз был найден результат.
function get_string_between_pos($string, $start, $end, $pos){ $cPos = 0; $ini = 0; $result = ''; for($i = 0; $i < $pos; $i++){ $ini = strpos($string, $start, $cPos); if ($ini == 0) return ''; $ini += strlen($start); $len = strpos($string, $end, $ini) - $ini; $result = substr($string, $ini, $len); $cPos = $ini + $len; } return $result; }
Применение:
$text = 'string has start test 1 end and start test 2 end and start test 3 end to print'; //get $result = "test 1" $result = $this->get_string_between_pos($text, 'start', 'end', 1); //get $result = "test 2" $result = $this->get_string_between_pos($text, 'start', 'end', 2); //get $result = "test 3" $result = $this->get_string_between_pos($text, 'start', 'end', 3);
strpos имеет дополнительный необязательный ввод, чтобы начать поиск в определенной точке. поэтому я сохраняю предыдущую позицию в $ cPos, поэтому, когда цикл for снова проверяется, он начинается с того места, где он остановился.
источник
Подавляющее большинство ответов здесь не отвечают на отредактированную часть, я думаю, они были добавлены раньше. Как упоминается в одном из ответов, это можно сделать с помощью регулярного выражения. У меня был другой подход.
Эта функция ищет $ string и находит первую строку между строками $ start и $ end, начиная с позиции $ offset. Затем он обновляет позицию $ offset, чтобы указать на начало результата. Если $ includeDelimiters истинно, он включает разделители в результат.
Если строка $ start или $ end не найдена, возвращается значение null. Он также возвращает null, если $ string, $ start или $ end являются пустой строкой.
function str_between(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?string { if ($string === '' || $start === '' || $end === '') return null; $startLength = strlen($start); $endLength = strlen($end); $startPos = strpos($string, $start, $offset); if ($startPos === false) return null; $endPos = strpos($string, $end, $startPos + $startLength); if ($endPos === false) return null; $length = $endPos - $startPos + ($includeDelimiters ? $endLength : -$startLength); if (!$length) return ''; $offset = $startPos + ($includeDelimiters ? 0 : $startLength); $result = substr($string, $offset, $length); return ($result !== false ? $result : null); }
Следующая функция находит все строки, которые находятся между двумя строками (без перекрытий). Для этого требуется предыдущая функция, и аргументы те же. После выполнения $ offset указывает на начало последней найденной строки результата.
function str_between_all(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?array { $strings = []; $length = strlen($string); while ($offset < $length) { $found = str_between($string, $start, $end, $includeDelimiters, $offset); if ($found === null) break; $strings[] = $found; $offset += strlen($includeDelimiters ? $found : $start . $found . $end); // move offset to the end of the newfound string } return $strings; }
Примеры:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
дает[' 1 ', ' 3 ']
.str_between_all('foo 1 bar 2', 'foo', 'bar')
дает[' 1 ']
.str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
дает[' 1 ', ' 3 ']
.str_between_all('foo 1 bar', 'foo', 'foo')
дает[]
.источник
Использование:
function getdatabetween($string, $start, $end){ $sp = strpos($string, $start)+strlen($start); $ep = strpos($string, $end)-strlen($start); $data = trim(substr($string, $sp, $ep)); return trim($data); } $dt = "Find string between two strings in PHP"; echo getdatabetween($dt, 'Find', 'in PHP');
источник
У меня были проблемы с используемой здесь функцией get_string_between (). Так что я пришел со своей версией. Может быть, это могло бы помочь людям в том же случае, что и мой.
protected function string_between($string, $start, $end, $inclusive = false) { $fragments = explode($start, $string, 2); if (isset($fragments[1])) { $fragments = explode($end, $fragments[1], 2); if ($inclusive) { return $start.$fragments[0].$end; } else { return $fragments[0]; } } return false; }
источник
написал их некоторое время назад, нашел их очень полезными для широкого круга приложений.
<?php // substr_getbykeys() - Returns everything in a source string that exists between the first occurance of each of the two key substrings // - only returns first match, and can be used in loops to iterate through large datasets // - arg 1 is the first substring to look for // - arg 2 is the second substring to look for // - arg 3 is the source string the search is performed on. // - arg 4 is boolean and allows you to determine if returned result should include the search keys. // - arg 5 is boolean and can be used to determine whether search should be case-sensative or not. // function substr_getbykeys($key1, $key2, $source, $returnkeys, $casematters) { if ($casematters === true) { $start = strpos($source, $key1); $end = strpos($source, $key2); } else { $start = stripos($source, $key1); $end = stripos($source, $key2); } if ($start === false || $end === false) { return false; } if ($start > $end) { $temp = $start; $start = $end; $end = $temp; } if ( $returnkeys === true) { $length = ($end + strlen($key2)) - $start; } else { $start = $start + strlen($key1); $length = $end - $start; } return substr($source, $start, $length); } // substr_delbykeys() - Returns a copy of source string with everything between the first occurance of both key substrings removed // - only returns first match, and can be used in loops to iterate through large datasets // - arg 1 is the first key substring to look for // - arg 2 is the second key substring to look for // - arg 3 is the source string the search is performed on. // - arg 4 is boolean and allows you to determine if returned result should include the search keys. // - arg 5 is boolean and can be used to determine whether search should be case-sensative or not. // function substr_delbykeys($key1, $key2, $source, $returnkeys, $casematters) { if ($casematters === true) { $start = strpos($source, $key1); $end = strpos($source, $key2); } else { $start = stripos($source, $key1); $end = stripos($source, $key2); } if ($start === false || $end === false) { return false; } if ($start > $end) { $temp = $start; $start = $end; $end = $temp; } if ( $returnkeys === true) { $start = $start + strlen($key1); $length = $end - $start; } else { $length = ($end + strlen($key2)) - $start; } return substr_replace($source, '', $start, $length); } ?>
источник
С некоторым отловом ошибок. В частности, для большинства представленных функций требуется наличие $ end, хотя на самом деле в моем случае он был необязательным. Используйте this is $ end необязательно, и оцените значение FALSE, если $ start вообще не существует:
function get_string_between( $string, $start, $end ){ $string = " " . $string; $start_ini = strpos( $string, $start ); $end = strpos( $string, $end, $start+1 ); if ($start && $end) { return substr( $string, $start_ini + strlen($start), strlen( $string )-( $start_ini + $end ) ); } elseif ( $start && !$end ) { return substr( $string, $start_ini + strlen($start) ); } else { return FALSE; } }
источник
Версия UTF-8 ответа @Alejandro Iglesias будет работать для нелатинских символов:
function get_string_between($string, $start, $end){ $string = ' ' . $string; $ini = mb_strpos($string, $start, 0, 'UTF-8'); if ($ini == 0) return ''; $ini += mb_strlen($start, 'UTF-8'); $len = mb_strpos($string, $end, $ini, 'UTF-8') - $ini; return mb_substr($string, $ini, $len, 'UTF-8'); } $fullstring = 'this is my [tag]dog[/tag]'; $parsed = get_string_between($fullstring, '[tag]', '[/tag]'); echo $parsed; // (result = dog)
источник
Есть лучшее решение для этого от Tonyspiro
function getBetween($content,$start,$end){ $r = explode($start, $content); if (isset($r[1])){ $r = explode($end, $r[1]); return $r[0]; } return ''; }
источник
Это легко сделать с помощью этой небольшой функции:
function getString($string, $from, $to) { $str = explode($from, $string); $str = explode($to, $str[1]); return $s[0]; } $myString = "<html>Some code</html>"; print getString($myString, '<html>', '</html>'); // Prints: Some code
источник
Рассмотрим эту функцию. Он принимает как номер позиции, так и строковые аргументы:
function get_string_between($string, $start = '', $end = ''){ if (empty($start)) { $start = 0; }elseif (!is_numeric($start)) { $start = strpos($string, $start) + strlen($start); } if (empty($end)) { $end = strlen($string); }elseif (!is_numeric($end)) { $end = strpos($string, $end); } return substr($string, $start, ($end - $start)); }
Полученные результаты:
echo get_string_between($string); // result = this is my [tag]dog[/tag] echo get_string_between($string, 0); // result = this is my [tag]dog[/tag] echo get_string_between($string, ''); // result = this is my [tag]dog[/tag] echo get_string_between($string, '[tag]'); // result = dog[/tag] echo get_string_between($string, 0, '[/tag]'); // result = this is my [tag]dog echo get_string_between($string, '', '[/tag]'); // result = this is my [tag]dog echo get_string_between($string, '[tag]', '[/tag]'); // result = dog echo get_string_between($string, '[tag]', strlen($string)); // dog[/tag]
источник