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

Есть ли функция php, которая может извлекать фразу между двумя разными символами в строке? Что-то вроде substr ();

Пример:

$String = [modid=256]; $First = "="; $Second = "]"; $id = substr($string, $First, $Second); 

Таким образом, $id будет 256

Любая помощь будет оценена 🙂

используйте этот код

 $input = "[modid=256]"; preg_match('~=(.*?)]~', $input, $output); echo $output[1]; // 256 

рабочий пример http://codepad.viper-7.com/0eD2ns

Использование:

 <?php $str = "[modid=256]"; $from = "="; $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)); } ?> 
 $String = [modid=256]; $First = "="; $Second = "]"; $Firstpos=strpos($String, $First); $Secondpos=strpos($String, $Second); $id = substr($String , $Firstpos, $Secondpos); 

Если вы не хотите использовать reqular expresion, используйте функции strstr , trim и strrev :

 // Require PHP 5.3 and higher $id = trim(strstr(strstr($String, '='), ']', true), '=]'); // Any PHP version $id = trim(strrev(strstr(strrev((strstr($String, '='))), ']')), '=]'); 

Регулярное выражение – ваш друг.

 preg_match("/=(\d+)\]/", $String, $matches); var_dump($matches); 

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

Вы можете использовать регулярное выражение:

 <?php $string = "[modid=256][modid=345]"; preg_match_all("/\[modid=([0-9]+)\]/", $string, $matches); $modids = $matches[1]; foreach( $modids as $modid ) echo "$modid\n"; 

http://eval.in/9913

 $str = "[modid=256]"; preg_match('/\[modid=(?P<modId>\d+)\]/', $str, $matches); echo $matches['modId']; 

(перемещен из комментария, потому что здесь легче формировать)

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

 $string_array = explode("=",$String); 

и на втором этапе я бы избавился от этого "]", может быть, через rtrim:

 $id = rtrim($string_array[1], "]"); 

… но это будет работать, только если структура всегда точно такая же …

-cheers-

ps: не должно быть на самом деле $ String = "[modid = 256]"; ?

Попробуйте регулярное выражение

 $String =" [modid=256]"; $result=preg_match_all('/(?<=(=))(\d+)/',$String,$matches); print_r($matches[0]); 

Вывод

Массив ([0] => 256)

DEMO

Объяснение Здесь он использовал «Положительный взгляд» (? <=) В регулярном выражении, например (? <= Foo) bar соответствует бару, когда ему предшествует foo, здесь (? <= (=)) (\ D +) мы сопоставляем (\ d + ) сразу после знака '='. \ d Соответствует любому символу цифры (0-9). + Соответствует 1 или более предшествующему токену

Вы можете использовать регулярное выражение или можете попробовать следующее:

 $String = [modid=256]; $First = "="; $Second = "]"; $posFirst = strpos($String, $First); //Only return first match $posSecond = strpos($String, $Second); //Only return first match if($posFirst !== false && $posSecond !== false && $posFirst < $posSecond){ $id = substr($string, $First, $Second); }else{ //Not match $First or $Second } 

Вы должны прочитать о substr. Лучшим способом для этого является регулярное выражение.