2011-03-04 4 views
1

Comment supprimer quoi que ce soit avant un caractère donné et quoi que ce soit après un caractère donné avec preg_replace en utilisant une expression régulière? Bien sûr, cela pourrait être fait de bien d'autres façons, comme exploser et rayer la chaîne. Mais je suis curieux de savoir preg_replace et regex.PHP preg_replace expression régulière

La seule chose que je dois de la chaîne est inférieure 03b et enlever tout avant/et barre oblique (/) et après/et le point (.)

$string = 'rmbefore/03b.rmafter' 

Merci à l'avance!

+0

Vous voulez dire que vous voulez la chaîne entre '/' et '.'? – codaddict

+0

Voir [outils de conception regex] (http://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world) et [regular-expressions.info] (http : //regular-expressions.info/) pour apprendre la syntaxe – mario

Répondre

4

Vous pouvez utiliser des backreferences à preg_replace pour ce faire:

preg_replace('#.*/([^\.]+)\..*#', '$1', $input); 

Ceci recherche quoi que ce soit jusqu'à une barre oblique, puis autant de la chaîne suivante qui n'est pas un point, mettez cela dans le groupe 1 (c'est le '()'), suivi d'un point et d'autre chose et le remplace par le contenu du groupe 1 (qui h est l'expression entre parenthèses et devrait être "03b" dans votre exemple). Voici un bon site sur regex: http://www.regular-expressions.info/php.html.

Espérons que cela aide.

0
$string = preg_replace('~^.*/(.*?)\..*$~',"$1",$string); 
3
$s = preg_replace("#^.*/(.*?)\\..*$#","$1",$string) 

Explication:

^ matches start of string 
.*  matches a string of arbitrary characters (greedy) 
/ matches the/
(.*?) matches a string of arbirtrary characters (non-greedy) 
\.  matches a dot 
.*  matches a string of arbitrary characters 
$  matches end of string 
+0

Vous avez oublié d'ajouter un délimiteur à votre regex. – codaddict

+0

merci, je ne connais pas bien la syntaxe php regex. Pourquoi nécessite-t-il un délimiteur quand il est déjà dans une chaîne? Je veux dire, je comprends le mettre entre les délimiteurs (Perl), le mettre dans une chaîne (Python), mais pourquoi les deux? – markijbema

2

Vous n'avez pas besoin regex pour ce cas, il serait plus de tuer. Vous pouvez simplement utiliser la construction dans les fonctions substr et strpos.

$from = strpos($string, '/') + 1; 
$to = strpos($string, '.'); 

echo substr($string, $from, $to - $from); 

// echos 03b 

Ofcause vous pouvez le faire en une seule ligne, ce qui précède était juste pour plus de clarté

echo substr($string, strpos($string, '/') + 1, strpos($string, '.') - strpos($string, '/') - 1);