2011-09-13 3 views
3

J'ai ce code.RegEx pour gérer l'entrée alphanumérique - PHP

<?php 
    $USClass = "3/312"; 
    $USClass = preg_replace_callback('~[\d.]+/[\d.]+~', function ($matches) { 
    $parts = explode('/', $matches[0]); 
    return $parts[1] . ',' . $parts[0]; 
    }, $USClass); 
    echo $USClass; 
?> 

Il imprime 312,3 qui est ce que je voulais.

Cependant, si je donne une entrée comme D12/336 alors cela ne fonctionne pas. Je veux imprimer 336, D12

Comment puis-je le faire? et Quel est le problème avec mon code actuel qui ne gère pas cet alphanumérique? Est-ce parce que j'ai utilisé \ d?

EDIT:

Je veux gérer les entrées comme celui-ci ainsi

148/DIG.111

alors la sortie devrait être DIG.111,148

Répondre

4

Oui \d ne contient que des chiffres.

Vous pouvez essayer \w place c'est alphanumérique, mais en outre, il comprend également _

Pour être Unicode, vous pouvez aller pour

~[\pL\d.]+/[\pL\d.]+~u 

\pL est un point de code Unicode avec la propriété « Lettre »

Le u à la fin activer le mode UTF-8 qui est nécessaire pour utiliser cette fonctionnalité

Voir http://www.php.net/manual/en/regexp.reference.unicode.php

Autre solution

Je pense que vous ar e faire cela un peu compliqué. Ce serait plus simple si vous utilisiez des groupes de capture.

essayer ceci:

$in = "148/DIG.111"; 
preg_match_all('~([\w.]+)/([\w.]+)~', $in, $matches); 
echo $matches[2][0] . ',' . $matches[1][0]; 

Explication:

([\w.]+)/([\w.]+) 
^^^^^^^^ ^^^^^^^^ 
Group 1 Group 2 

En raison des crochets de la chaîne correspondante est stockée dans la matrice $matches.

Voir here pour plus de détails sur preg_match_all

+0

Great! Ce code fonctionne! ' ' –

+0

@Bhavani Kannan J'ai mis à jour ma réponse avec une solution Unicode. Je pense que le '\ w' ne couvrira que les lettres ascii. – stema

+0

@Bhavani Kannan J'ai mis à jour ma réponse avec une solution peut-être meilleure. – stema

2

Avec un simple preg_replace:

$USClass = "148/DIG.111"; 
$USClass = preg_replace('#(.+?)/(.+)#', "$2,$1", $USClass); 
echo $USClass; 

sortie:

DIG.111,148 
+0

+1 pour une solution plus simple – stema

Questions connexes