Php получить строку между двумя строками

Как получить подстроку между двумя строками в PHP?

Мне нужна функция, которая возвращает подстроку между двумя словами (или двумя символами). Мне интересно, есть ли функция php, которая достигает этого. Я не хочу думать о регулярном выражении (хорошо, я мог бы сделать одно, но на самом деле не думаю, что это лучший способ пойти). Думая о функциях strpos и substr . Вот пример:

$string = "foo I wanna a cake foo"; 

Назовем функцию: $substring = getInnerSubstring($string,»foo»);
Он возвращает: «Я хочу пирог».

Update: Ну, до сих пор я могу просто получить подстроку, состоящую из двух слов только в одной строке, разрешите ли я отпустить меня немного дальше и спросить, могу ли я расширить использование getInnerSubstring($str,$delim) , чтобы получить любые строки, которые находятся между значением delim, например:

$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero foo"; 

ОТВЕТЫ

Ответ 1

Если строки разные (например: [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) 

Ответ 2

Регулярные выражения — это путь:

$str = 'before-str-after'; if (preg_match('/before-(.*?)-after/', $str, $match) == 1)

Ответ 3

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("a","c","abc"); // returns: 'b' echo getBetween("h","o","hello"); // returns: 'ell' echo getBetween("a","r","World"); // returns: '' 

Ответ 4

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" 

Ответ 5

function getInbetweenStrings($start, $end, $str) < $matches = array(); $regex = "/$start([a-zA-Z0-9_]*)$end/"; preg_match_all($regex, $str, $matches); return $matches[1]; >

для примера вам нужен массив строк (ключей) между @@в следующем пример, где ‘/’ не находится между

$str /cdn-cgi/l/email-protection" data-cfemail="3f5e5b605c4a4c4b5052605e4b4b4d0e7f">[email protected]@/@@[email protected]@/@@[email protected]@"; $str_arr = getInbetweenStrings('@@', '@@', $str); print_r($str_arr); 

Ответ 6

Мне нравятся решения с регулярным выражением, но никто из других не подходит мне.

Читайте также:  Ассоциативный массив java map

Если вы знаете, что только один результат, вы можете использовать следующее:

$between = preg_replace('/(.*)BEFORE(.*)AFTER(.*)/sm', '\2', $string); 

Измените BEFORE и AFTER на нужные разделители.

Также имейте в виду, что эта функция вернет всю строку в случае, если ничего не найдено.

Это решение является многострочным, но вы можете играть с модификаторами в зависимости от ваших потребностей.

Ответ 7

Если вы используете foo как разделитель, посмотрите explode()

Ответ 8

Это вернет «парня посередине».

Ответ 9

дважды используйте функцию 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; 

Ответ 10

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 в $string .

Ответ 11

Если у вас несколько повторений из одной строки, и у вас разные шаблоны [start] и [\ end]. Здесь функция, которая выводит массив.

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

Ответ 12

Не php pro. но я недавно столкнулся с этой стеной, и это то, что я придумал.

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 "
"; print_r(tag_contents($string , "[animal]" , "[/animal]")); echo "

"; //result Array ( [0] => cat [1] => dog [2] => panda )

Ответ 13

Ответ 14

Немного улучшенный код от GarciaWebDev и Henry Wang. Если задан пустой $start или $end, функция возвращает значения от начала или до конца строки $. Также доступна опция Inclusive, хотим ли мы включить результат поиска или нет:

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

Ответ 15

Я должен добавить что-то на пост Юлиуса Тильвикаса. Я искал решение, подобное тому, которое он описал в своем посте. Но я думаю, что есть ошибка. Я не понимаю строку между двумя строками, я также получаю больше с этим решением, потому что мне приходится вычитать длину начальной строки. Когда вы это сделаете, я действительно получаю строку между двумя строками.

Вот мои изменения в его решении:

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

Ответ 16

Попробуйте это, его работа для меня, получите данные между тестом.

$str = "Xdata test HD01 test 1data"; $result = explode('test',$str); print_r($result); echo $result[1]; 

Ответ 17

В стиле PHP strpos это вернет false , если начальная метка sm или конечная метка em не найдены.

Этот результат ( false ) отличается от пустой строки, которую вы получаете, если между начальной и конечной метками нет ничего.

function between( $str, $sm, $em )

Функция вернет только первое совпадение.

Очевидно, но стоит упомянуть, что функция сначала ищет sm , а затем для em .

Это означает, что вы не можете получить желаемый результат/поведение, если сначала нужно выполнить поиск em , а затем строку нужно проанализировать назад в поиске sm .

Ответ 18

Это функция, которую я использую для этого. Я объединил два ответа в одной функции для одиночных или нескольких разделителей.

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, '', '', true); 

Ответ 19

if (count(explode("", $input))>1)< $content = explode("",explode("", $input)[1])[0]; >else

Подставка для любого разделителя, который вы хотите.

Ответ 20

Улучшение Алехандро ответ. Вы можете оставить аргументы $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); >> 

Ответ 21

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

Ответ 22

У меня были некоторые проблемы с функцией 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; > 

Ответ 23

написал это некоторое время назад, нашел, что он очень полезен для широкого круга приложений.

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

Ответ 24

С некоторой ошибкой. В частности, большинство представленных функций требуют, чтобы end end существовал, когда на самом деле в моем случае мне было необходимо, чтобы это было необязательным. Использовать это $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; >> 

Ответ 25

Версия 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) 

Ответ 26

Получил лучшее решение для этого от tonyspiro

function getBetween($content,$start,$end) < $r = explode($start, $content); if (isset($r[1]))< $r = explode($end, $r[1]); return $r[0]; >return ''; > 

Ответ 27

отредактированный вариант того, что написал Алехандро Гарсия Иглесиас.

Это позволяет вам выбрать конкретное местоположение строки, которую вы хотите получить, исходя из количества найденных результатов.

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 снова проверяется, он начинается в конце того места, где он остановился.

Ответ 28

Подавляющее большинство ответов здесь не отвечают отредактированной части, я думаю, они были добавлены ранее. Это можно сделать с помощью регулярных выражений, как упоминается в одном ответе. У меня был другой подход.

Эта функция ищет строку $ и находит первую строку между строками $ start и $ end, начиная с позиции $ offset. Затем он обновляет позицию смещения $, чтобы он указывал на начало результата. Если $ includeDelimiters имеет значение true, в результат включаются разделители.

Если строка $ start или $ end не найдена, возвращается ноль. Он также возвращает ноль, если $ string, $ start или $ end являются пустой строкой.

function str_between(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?string

Следующая функция находит все строки, которые находятся между двумя строками (без перекрытий). Требуется предыдущая функция, а аргументы совпадают. После выполнения $ 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’) дает [] .

Ответ 29

function strbtwn($s,$start,$end)

Ответ 30

Я использую это много лет, и он работает хорошо. Вероятно, можно сделать более эффективным, но

grabstring ( «Test string», «,» «, 0) возвращает тестовую строку
grabstring ( «тестовая строка», «тест», «», 0) возвращает строку
grabstring ( «тестовая строка», «s», «», 5) возвращает строку

function grabstring($strSource,$strPre,$strPost,$StartAt) < if(@strpos($strSource,$strPre)===FALSE && $strPre!="")< return(""); >@$Startpoint=strpos($strSource,$strPre,$StartAt)+strlen($strPre); if($strPost == "") < $EndPoint = strlen($strSource); >else < if(strpos($strSource,$strPost,$Startpoint)===FALSE)< $EndPoint= strlen($strSource); >else < $EndPoint = strpos($strSource,$strPost,$Startpoint); >> if($strPre == "") < $Startpoint = 0; >if($EndPoint - $Startpoint < 1) < return ""; >else

Источник

Оцените статью