Pagina 1 di 1

Aiuto RegExpression

Inviato: mer 26 set 2012, 9:31
da darkstaring
Ciao :)
E dà un pò che inizio a vedere le espressioni regolari ma ancora ho tanto da imparare...
Mi sapete dire se è possibile trovare il testo tra 2 parentesi tonde??
Ho un testo di questo tipo: "12.12.12-@-3-2(1)11"; in questo caso vorrei prendere solo l' uno tra le tonde..
Ho un numero finito di valori, ovvero un numero di massimo 2 cifre: [0-9]{1,2}
ma non riesco a prendere solo quelo che è tra le tonde
Sono due giorni che tento :)
Sapete aiutarmi???

Re: Aiuto RegExpression

Inviato: mer 26 set 2012, 10:24
da ZeroUno
^.*\(([0-9]{1,2})\).*$

Re: Aiuto RegExpression

Inviato: mer 26 set 2012, 10:52
da darkstaring
Grazie ZeroUno :D

Ho provato ad applicarla su 2 stringhe: "29.10.10-A(4)" e "espressioni(4) regolari!"
Per provare a sostituire il numero (4) con "Trasformato"
ma sembra non funzionare,

Codice: Seleziona tutto

<?php
$testo = "29.10.10-A(4)" ; //"espressioni(4) regolari!";
$var=str_replace("^.*\(([0-9]{1,2})\).*$","Trasformato:", $testo);
print $var;
?>
In entrambi i casi il 4 rimane quattro e non diventa "Trasformato" come mi aspettavo :x...

Sbaglio perchè devo cambiare la funzione str_replace con un'altra che
estrae quello che verifica la reg.ex???
Se si potersti dirmi quale è ? :D
Grazie

Re: Aiuto RegExpression

Inviato: mer 26 set 2012, 11:36
da ZeroUno
ecco, già a sapere quello che vuoi fare è meglio.


$var=preg_replace("/\([0-9]{1,2}\)/","(Trasformato:)",$testo);

http://it2.php.net/preg_replace

Re: Aiuto RegExpression

Inviato: mer 26 set 2012, 21:44
da darkstaring
ZeroUno ha scritto:ecco, già a sapere quello che vuoi fare è meglio.
:D
Ti ringrazio per la chicca adesso me la vedo :)
Comunque ho aggirato il problema diversamente, partendo dalla tonda di destra e prendendo quello che cè dopo la destra
Grazieee comunque
:)

Re: Aiuto RegExpression

Inviato: gio 27 set 2012, 1:27
da targzeta
Tieni presente che in PHP, se vuoi estrapolare differenti informazioni da una stringa, con una regexp fai tutto in un colpo solo. Ovvero, dato che, se non ricordo male, la stringa in oggetto contiene anche una data, e dato che tu vuoi anche estrapolare la data, invece di fare mille substring, ti basta una sola regexp per prelevare sia la data che il termine tra parentesi.

Emanuele

Re: Aiuto RegExpression

Inviato: gio 27 set 2012, 17:24
da darkstaring
Umm, non saprei perche ci sono diversi casi da interpretare..

Oltre al campo data e il termine tra le parentesi ci possono essere uno o più termini al centro separati da un meno..
Questo potrebbe essere un'esempio
12.12.12-@-SP-4(2)
in'oltre tutti i dati vanno passati ad un database, quindi bisogna verificare ogni membro
per vedere se è possibile inserirlo nella tabella, per il fatto delle chiavi esterne...
In più ogni stringa non contiene solo questi campi, ma avvolte ci sono altre info
quindi di fatto potrebbe arrivare "djoaejdowi12.12.12-@-SP-4(2)NOSHOWnckndsk" :D
la scritta noshow non l'ho scritta a caso :)
se è presente si deve cambiare un flag da inserire nel db..
E poi ci sono anche altri controlli
Non credo sia possibile farlo in un solo colpo, tanto meno da mè :D
non riuscivo a vedere il contenuto tra le 2 parentesi :x , figuriamoci......
Comunque grazie

Re: Aiuto RegExpression

Inviato: gio 27 set 2012, 19:09
da targzeta
Ok, come credi, però da come descrivi ciò che devi fare, sembra proprio un lavoro da far fare a preg_match(). Potrebbe essere un buon esercizio e, se vuoi, ti possiamo dare una mano anche io.

Emanuele

Re: Aiuto RegExpression

Inviato: gio 27 set 2012, 20:21
da ZeroUno
confermo preg_match. Io direi, dacci il caso più complicato che ti può capitare e vediamo che si può fare.
Vedrai.. una volta partito con le regex ti divertirai un mondo.

Re: Aiuto RegExpression

Inviato: gio 27 set 2012, 22:34
da darkstaring
ZeroUno ha scritto:Vedrai.. una volta partito con le regex ti divertirai un mondo.
Aahahahahah :D
Sicuramente si, ma che complicate che sembrano :?
Comunque un caso abbastanza complicato potrebbe essere quello che ho scritto prima, dove oltre alle info essenziali ci sono anche altri caratteri..
Comunque questi sono alcuni esempi:

Codice: Seleziona tutto

NOTE:08.06.11-2(3)\" 29.06.11-2(3)\" 20.07.11-2(3)\" 01.09.11-2(3)\" 23.09.
 11-2(4)\" 14.10.11-2(5)\" 03.11.11-2(6)\" 29.11.11-2(9)\" 20.12.11-2(9)\" 
 11.01.12-2(3)\" 01.02.12-2(3)\" 22.02.12-2(9)\" 14.03.12-2(9)\" 04.04.12-2
 (3)\" 26.04.12-2(3)\" 23.05.12-2(3)\" 13.06.12-2-3(9)\" 04.07.12-T(8)\"23.
 08.12-2(3)\"13.09.12-2(6)\"\nUser: corsista
NOTE:26.10.10-2(1)\" 12.11.10-2(1)\" 01.12.10-2(1)\" 19.12.10-2(1)\" 04.01.
 11-2(1)\" 24.01.11-2(1)\"  11.02.11-2(1)\" 28.02.11-2(1)\" 15.03.11-2(1)\"
  01.04.11-2(1)\" 15.04.11-3(1)\" 19.04.11-2(1)\" 06.05.11-2(1)\" 20.05.11-
 2(1)\" 07.06.11-2(1)\" 28.06.11-2(1)\" 15.07.11-2(1)\" 03.08.11-2(1)\" 20.
 12.11-2(1)\" 24.01.11-2(1)\" 11.02.11-2(1)\" 28.02.11-2(1)\" 15.03.11-2(1)
 \" 01.04.11-2(1)\" 09.01.12-2(1)\" 27.01.12-2(1)\" 14.02.12-2(1)\" 02.03.1
 2-2(1)\" 20.03.12-2(1)\" 06.04.12-2(1)\" 24.04.12-2(1)\" 11.05.12-2(4)\" 0
 5.06.12-2(1)\" 26.06.12-2(1)\" 17.07.12-2(1)\"\n\n.
NOTE:15.10.10.2(8)\" 05.11.10-2(2)\" 26.11.10-2(2)\" 21.12.10-2(9) no show
NOTE:07.04.11-834(@)\" 15.09.11-4609-@ 31.03.12-9331@ 04.03.12-9446-@ 17.03
 .12-12145@\n
Quà ci sono degli errori.. per esempio "07.04.11-834(@)" contiene una '@' dentro le tonde
mentre invece ci dovrebbero stare solo numeri....

Comunque questa dovrebbe essere la procedura da intraprendere :)
  • dividere tutte le note dal carattere ' " ' (doppio apice) e ciclare per ogni una;
    Vedere se su ogni nota si trova la parola 'show'
    Convertire la data dal formato italiano a quello americano
    Trovare il numero dei trattamenti, sono divisi da un meno e possono essere diversi
    Trovare il codice dipendente tra le tonde
Su i primi due punti sembrerebbe che ci sono ma non saprei come un'istruzione possa scrivere ciclicamente delle cose..
Diciamo che mi fermo quì:

Codice: Seleziona tutto

<?php
$prova="01.05.12-2-4";
$nota=preg_replace('/(\d{2}).(\d{2}).(\d{2})-/', 'INSERT INTO....(\'20$3-$2-$1 00:00:00\', ', $prova);
print $nota;
?>
In questo caso devo scrivere 2 query, una con trattamento 2 ed un'altra con il 4 sempre con stessa data e dipendente
Al momento la vedo grigia...

Re: Aiuto RegExpression

Inviato: ven 28 set 2012, 19:01
da targzeta
Quindi quando si incontra una con '(@)' o una con '-@' o una con '-122@' cosa bisogna fare? Annullare tutto?

Emanuele

Re: Aiuto RegExpression

Inviato: ven 28 set 2012, 23:13
da darkstaring
Ahahahaahah :)
ci stai ancora lavorando
Ti posto le tabelle così rendo meglio l'idea

Codice: Seleziona tutto

mysql> select * from trattamento;
+------+-------------------+
| tipo | descrizione       |
+------+-------------------+
| 1    | Ricostruzione     |
| 2    | Refill            |
| 3    | Ricostr. Piedi    |
| @    | Tratt Estetico    |
| A    | Riparazione       |
| A2   | Riparazione mani  |
| A3   | Riparazione piedi |
| SP   | Semipermanente    |
| T    | Tolte             |
| T2   | Tolte mani        |
| T3   | Tolte piedi       |
| XX   | SCONOSCIUTO       |
+------+-------------------+
12 rows in set (0.00 sec)

mysql> select * from dipendenti;
+----+-------------+---------+----------+
| id | nome        | Cognome | Telefono |
+----+-------------+---------+----------+
|  1 | Sandra      | cognome | telefono |
|  2 | Rita        | cognome | telefono |
|  3 | Paola       | cognome | telefono |
|  4 | Ornella     | cognome | telefono |
|  5 | Ester       | cognome | telefono |
|  6 | Antonella   | cognome | telefono |
|  7 | Daniela V   | cognome | telefono |
|  8 | Floriana    | cognome | telefono |
|  9 | Claudia     | cognome | telefono |
| 10 | Daniela B   | cognome | telefono |
| 11 | Denise      | cognome | telefono |
| 12 | Bengi       | cognome | telefono |
| 13 | Francesca   | cognome | telefono |
| 14 | SCONOSCIUTO | cognome | telefono |
| 20 | Grazia      | cognome | telefono |
+----+-------------+---------+----------+
15 rows in set (0.00 sec)
Dove l'appuntamento è formato da
giorno.mese.anno-trattamento1-trattamento2.....-trattamentoN ( dipendente )
Per quanto sia contorta
questa è la mia soluzione

Codice: Seleziona tutto

<?php
//CONNETTO A MYSQL
	if (!($mylink = mysql_connect("localhost","root","")))
	{
		print "<h3>Non riesco a collegarmi a mysql, modifica connessione.php</h3>\n";
		exit;
	}
	
	mysql_select_db("AGENDASASSARI");// or die "Non riesco a selezionare il database";
	$nomefile="sassari.vcf";
/*	mysql_select_db("AGENDAPTORRES");
	$nomefile="ptorres.vcf";
	mysql_select_db("AGENDASORSO");
	$nomefile="sorso.vcf";
*/
$elimina_appuntamenti=mysql_query("delete from appuntamenti;");
if($elimina_appuntamenti==FALSE) print "Non riesco ad eliminare i vecchi appuntamenti!".mysql_error();
$elimina_clienti=mysql_query("delete from clienti;");
if($elimina_clienti==FALSE) print "Non riesco ad eliminare i vecchi clienti!".mysql_error();

$idcliente="";

  $file = fopen("$nomefile", "r" )or die ("Non posso aprire il file \n");
  $stato = 0;
  while (! feof($file))
  {
    $riga=preg_replace('/[[:space:]]+/', ' ', fgets($file, 1024));
    
    //TRASFORMO RIGA IN MAIUSCOLO
    $riga= strtoupper($riga);
    //$riga= str_replace("'","",$riga);
    
    $show=0;
    if ( substr($riga,0,2) == "FN") 
      $stato=1;
    elseif (substr($riga,0,3) == "TEL")
      $stato=2;
    elseif ( substr($riga,0,4) == "NOTE")
      $stato=3;
    elseif ( substr($riga,0,3) == "END")
      $stato=4;    
    elseif (($stato != 3)||($stato == 0) )
      continue;
 
    switch($stato)
    {
      case 1:
	$nome_cognome=substr($riga, 3);
	$nome_cognome=str_replace("'","",$nome_cognome);
	$nome_array = explode(" ", $nome_cognome);
	if(isset($nome_array[3]))
	{
	  $nome_array[0]=$nome_array[0]."".$nome_array[1];
	  $nome_array[2]=$nome_array[3];
	}
	if ($nome_array[0] == "") $nome_array[0] = "Sconosciuto";
	if ($nome_array[1] == "") $nome_array[1] = "Sconosciuto";
	$stato=0;
	break;
      case 2:
	$telefono= substr($riga,14);
	//print "<BR><h3>$nome_array[0] $nome_array[1]</h3>";
	/*
	 $stringaclienti="INSERT INTO clienti VALUES (NULL, '$nome_array[0]','$nome_array[1]','$telefono', NULL);";
	db_clienti($stringaclienti);
	$idcliente=mysql_insert_id();
	*/
	//print "<BR><FONT color=GREEN>Ultimo ID cliente inserito = $idcliente</FONT>";
	$stato=0;
	break;
      case 3:
	if(isset($note)) $note= $note."".$riga;
	else $note=substr($riga,5);
	break;
      case 4:
	if(!isset($note))
	{
	  $stato=0;
	  continue;
	}
	//INSERISCO QUÌ IL CLIENTE, SOLO SE CI SONO APPUNTAMENTI
	$stringaclienti="INSERT INTO clienti VALUES (NULL, '$nome_array[0]','$nome_array[1]','$telefono', NULL, NULL);";
	db_clienti($stringaclienti);
	$idcliente=mysql_insert_id();
	
	//Divido ogni singolo appuntamento
	$appuntamenti = explode("\"", $note);
	if(count($appuntamenti) < 1)
	{
	   $stato=0;
	   continue;
	}
	  for($j=0;$j<count($appuntamenti);$j++)
	    {
	      controlla_appuntamento($appuntamenti[$j]);       
	    }
	    if(preg_match("*:*",$note))
	      {
		$note=@explode(":",$note);
		aggiornainfocliente($note);
	      }
	    $stato=0;
	    unset($note);unset($nome_array);unset($data);unset($appuntamenti);
	    break;
     }//FINE SWITCH
  }//FINE LEGGI-RIGA
?>

<?php

function controlla_appuntamento($appuntamento)
{
global $idcliente;
//Elimino gli spazi: 
	      $appuntamento=str_replace(" ", "", $appuntamento);
	      //verifico se no show e metto 1 se cè
	      if(preg_match("/show/i",$appuntamento)) $show=1;
	      else $show=0;
	      $s_appunt=explode(")", $appuntamento);
	      //Esempio $s_appunt[0] => 16.11.10-2(4 => 21.05.11-2-5-2-3(3
	      $info= explode("-",$s_appunt[0]);
	      
	      //Formo la data
	      $data=$info[0]; //INFO[0] CONTIENE DATA
	      
	      //ELIMINO LETTERE BACKSLASH E ' :'
	      $data=ereg_replace("[A-Z]","",$data);
	      $data=str_replace("\\","",$data);
	      $data=str_replace("\/","",$data);
	      $data=str_replace(":","",$data);
	      
	      $data=explode(".",$data);
	      if( isset($v_data[0]) && isset($v_data[1]) && isset($v_data[2]) )
		    $data=controlladata($data);
	      //else break;
	      
	      //Trovo tutti i trattamenti per questo appuntamento
	      //da INFO[1] a INFO[FINE]
	      for($i=count($info)-1;$i>0;$i--)
		  {
		    if(@preg_match("*\(*", $info[$i]))
		      {
		      //print "<BR>TROVO: $info[$i]<BR>";
			$divisione=explode("(",$info[$i]);
			$dipendente= $divisione[1];
			$dipendente=controlladipendente($dipendente);
			$prestazione= $divisione[0];
			$prestazione=controllaprestazione($prestazione);
			@$stringaappuntamenti="INSERT INTO appuntamenti VALUES  ( null , '20$data[2]-$data[1]-$data[0] 10:00:00', '$s_appunt[0]', $idcliente, $dipendente, '$prestazione',$show);";
			db_trattamenti($stringaappuntamenti);
		      }else
		      {
			$prestazione=$info[$i];
			$prestazione=controllaprestazione($prestazione);
			@$stringaappuntamenti="INSERT INTO appuntamenti VALUES  ( null , '20$data[2]-$data[1]-$data[0] 10:00:00', '$s_appunt[0]', $idcliente, $dipendente, '$prestazione',$show);";
			db_trattamenti($stringaappuntamenti);
		      }
		  }
}
function aggiornainfocliente($x)
{
  global $idcliente;
  $infocliente="";
  for ($i=1;$i<count($x);$i++)
  {
    if(isset($infocliente)) $infocliente= $infocliente."".$x[$i];
    else $infocliente=$x[$i]; 
  } 
  $infocliente=str_replace("\"","",$infocliente);
	$aggiornainfo="update clienti set info = \"$infocliente\" where id=$idcliente";

	if( mysql_query($aggiornainfo)==FALSE)
	  {
	    print "ERRORE INFO CLIENTE $idcliente \t ESPRESSIONE: $aggiornainfo \n \n";
	  }
}

function controlladata($v_data)
{
  global $nome_array;
  if(! isset($v_data[0])) //SE GIORNO NON PRESENTE
    $v_data[0]=1;
  if(! isset($v_data[1])) //SE MESE NON PRESENTE
    $v_data[1]=1;
  if(! isset($v_data[2])) //SE ANNO NON PRESENTE
    $v_data[2]=50;
  
  if(checkdate($v_data[1],$v_data[0],"20".$v_data[2]) == FALSE)
    print "CLIENTE: $nome_array[0] $nome_array[1] data \"$v_data[0],$v_data[1],20.$v_data[2]\" non valida \n";
return($v_data);
}
function controlladipendente($x)
{
  //AGGIUNGERE SE CE UN NUMERO CONTROLLA SE +DI 14+
  if ($x=='A')
  {
    $x="6";
    return($x);
  }elseif ($x=='B')
  {
    $x="12";
    return($x);
  }else
  if(@preg_match("/[A-Z]/",$x)) $x="14";
  elseif( (int)$x > 13) $x=14;
  return ($x);
}
function controllaprestazione($prestazione)
{
  if (($prestazione == "1" ) || ($prestazione == "2" ) ||($prestazione == "3" ) || ($prestazione == "@" ) || ($prestazione == "A" ) || ($prestazione == "A2" ) || ($prestazione == "A3" ) || ($prestazione == "SP" ) || ($prestazione == "T" ) || ($prestazione == "T2" ) || ($prestazione == "T3" ) )
      return($prestazione);
  elseif($prestazione == "3T") $prestazione="T3";
  else  $prestazione="XX"; //Per tutti i caratteri non in trattamenti

    return($prestazione);
}

function db_clienti($query)
{
  //print "<BR> Query arrivata: \t $query <BR>";
  if(mysql_query($query) == FALSE)
      {
	print "ERRORE INSERIMENTO CLIENTE \t \t '$query' \n \n";//.mysql_error();
      }
      //else print "<BR>OK APPUNTAMENTO \t '$query' ";
}

function db_trattamenti($query)
{
  if(mysql_query($query) == FALSE)
      {
      
	global $j;
	global $appuntamenti;
	global $nome_array;
	print "ERRORE APPUNTAMENTO di |$nome_array[0] - $nome_array[1]| \t ESPRESSIONE ARRIVATA: $appuntamenti[$j]\n"; ;// \t '$query' <br></font>";//.mysql_error();
	//print "Query arrivata: \t $query \n \n";
      }
      //else print print "<BR>OK APPUNTAMENTO \t '$query' ";
}

?>
Quindi credi sia possibile fare tutto in una istruzione?

Re: Aiuto RegExpression

Inviato: sab 29 set 2012, 0:04
da targzeta
Io volevo solo sapere se '-@' fosse valido oppure no, ma da quello che vedo, sì.

Per il resto, a me basti che ti funzioni e che tu ne sia soddisfatto. Quello che ti dicevo è che se dai uno sguardo alla funzione preg_match() di PHP, ti accorgerai che puoi spezzare la tua riga in un array secondo una regexp e quindi poi effettuare tutte le operazioni che vuoi direttamente su quell'array. Prova a darci un'occhiata e se hai bisogno di un aiuto, noi siamo qui.

Emanuele