web-dev-qa-db-fra.com

Extraire une sous-chaîne entre deux caractères d'une chaîne PHP

Existe-t-il une fonction php capable d'extraire une phrase entre 2 caractères différents dans une chaîne? Quelque chose comme substr ();

Exemple:

$String = [modid=256];

$First = "=";
$Second = "]";

$id = substr($string, $First, $Second);

Donc $id serait 256

Toute aide serait appréciée :)

35
Sebastian

utiliser ce code

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

exemple de travail http://codepad.viper-7.com/0eD2ns

58
Yogesh Suthar

Utilisation:

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

?>
22
Salim
$String = "[modid=256]";

$First = "=";
$Second = "]";

$Firstpos=strpos($String, $First);
$Secondpos=strpos($String, $Second);

$id = substr($String , $Firstpos, $Secondpos);
4
cartina

Si vous ne souhaitez pas utiliser d'expression régulière, utilisez strstr , trim et strrev functions:

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

// Any PHP version
$id = trim(strrev(strstr(strrev((strstr($String, '='))), ']')), '=]');
3
tasmaniski

Regular Expression est votre ami.

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

Cela correspond à n'importe quel nombre, pour d'autres valeurs, vous devrez l'adapter.

1
Gerald Schneider

Vous pouvez utiliser une expression régulière:

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

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

echo $matches['modId'];
1
Prasanth Bendra

(déplacé du commentaire parce que le formatage est plus facile ici)

cela pourrait être une approche paresseuse, mais dans de tels cas, je commencerais généralement par faire exploser ma chaîne comme ceci: 

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

et dans un deuxième temps je me débarrasserais de ce "]" peut-être par le biais de rtrim: 

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

... mais cela fonctionnera uniquement si la structure est toujours exactement la même ...

-à votre santé-

ps: ne devrait-il pas s'agir de $ String = "[modid = 256]";?

0
tillinberlin

Essayez l'expression régulière

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

Sortie

Tableau ([0] => 256)

D&EACUTE;MO

Explication Ici, on utilise le regard positif derrière (? <=) Dans une expression régulière par exemple (? <= foo) bar correspond à bar lorsqu'il est précédé de foo, ici (? <= (=)) (\ d +), on fait correspondre le (\ d +) juste après le signe '=' .\d Correspond à n'importe quel caractère numérique (0-9) . + Correspond à au moins un des jetons précédents

0
Reshil