2010-04-09 5 views
3

J'ai des données dans le format decomment extraire la sous-chaîne de la chaîne ayant une longueur variable de caractère en php?

C222 = 50 
C1234P687 = 'some text' 
C123YYY = 'text' 
C444 = 89 
C345 = 3 
C122P687 = 'some text' 
C122YYY = 'text' 
.... 
.... 

donc essentiellement 3 différentes formes

  1. "C" nombre = valeur, par exemple - C444 = 89
  2. "C" nombre "P" nombre = valeur, par exemple - C123P687 = 'texte'
  3. "C" nombre "YYY" = valeur

Onl Le nombre y est de longueur variable sur le côté gauche du signe (=). Les valeurs varient.

Je veux stocker les données dans db comme

INSERT INTO datatable 
    c_id = "number after C" 
    p_id = "number after P" // if it exists for a line of data 
    value = 'value' 
    yyy = 'value' 

Toute idée comment récupérer ces chiffres?

Merci

+0

Qu'est-ce que yyy dans C122YYY? – zaf

+0

@zaf ..Au système, cela signifie que l'élément C122 a également d'autres valeurs. YYY ici est juste une étiquette pour identifier cette autre valeur. – user187580

Répondre

5

Utilisez des expressions régulières en PHP. Le modèle d'expression régulière suivant correspondra à tous les cas que vous avez fournis - utilisez-le avec preg_match_all (passez dans un tableau et PREG_SET_ORDER) et le tableau que vous avez transmis contiendra alors un tableau par ligne de vos données, et le tableau de chaque ligne contiendra 5 éléments.

(C[\d]+)(P[\d]+)?(YYY)? = (.+) 

Le premier élément du tableau contiendra la chaîne complète qui a été testée.

Le deuxième élément du tableau contiendra le numéro "C".

Le troisième élément du tableau contiendra le numéro "P" s'il est présent, sinon il sera vide.

Le quatrième élément du tableau contiendra "YYY" s'il est présent, sinon il sera vide.

Le cinquième élément du tableau contiendra la valeur.

En réponse à un commentaire précédent, l'expression régulière qui suit est une version modifiée de ce qui précède, mais ne comprendra pas les C et P dans les valeurs reconnues:

C([\d]+)(?:P([\d]+))?(YYY)? = (.+)

+0

Andy, tu es une star !! Merci beaucoup. – user187580

+0

yay, regex !! :) – knittl

3

Je suppose que les données sont lues à partir d'un fichier, donc utiliser quelque chose comme file_get_contents ou fopen.

Pour les données des expressions régulières est vous meilleur pari ..

Jetez un oeil à http://php.net/manual/en/function.preg-match-all.php

# UPDATE REG EX UPDATED 
preg_match_all("|C([\d]+)(?:P([\d]+))?(YYY)? = (.+)|", $yourDataLine, $out, PREG_SET_ORDER); 

$out[0] = TESTED STRING e.g. C123 = 456;  
$out[1] = C; 
$out[2] = P; 
$out[3] = YYY; 
$out[4] = VALUE; 

expression reg grâce à: Andy Shellam

+0

+1 pour le conseil pour analyser les données ligne par ligne - J'ai supposé dans ma réponse que l'ensemble des données était une seule variable. –

+0

Oui cela fonctionne mais je dois supprimer C, P en utilisant substr. Re données. Je reçois juste ces données sous la forme d'un morceau de tableaux. un tableau en même temps. Et je ai essayé d'utiliser regex donné sur chaque entrée de tableau. Merci – user187580

+0

Référence supprimant le C et P en utilisant substr - utilisez la regex modifiée suivante pour saisir uniquement les nombres des composants C et P: 'C ([\ d] +) (?: P ([\ d] +))? (YYY)? = (. +) ' –

1

Une solution sans utiliser des expressions régulières :

<?php 

$s="C23YYY = 'hello world'"; 

$p1=explode('=',$s); 

$left=trim($p1[0]); 
$right=trim($p1[1]); 

$value=$right; 

if(substr($left,-3)!='YYY'){ 
    $pos=strpos($left,'P'); 
    if($pos!==false){ 
     $c_id=substr($left,1,$pos-1); 
     $p_id=substr($left,1+$pos-strlen($left)); 
    }else{ 
     $c_id=substr($left,1-strlen($left)); 
    } 
}else{ 
    $c_id=substr($left,1,strlen($left)-4); 
    $yyy='YYY'; 
} 

print("c_id = $c_id <br/>"); 
print("p_id = $p_id <br/>"); 
print("value = $value <br/>"); 
print("yyy = $yyy <br/>"); 

?> 
Questions connexes