Je suppose que le titre est assez abstrait.

J'ai donc des tableaux qui contiennent une adresse (voici un exemple):

array(4) { ["cod"]=> int(200) ["message"]=> string(7) "SUCCESS" ["found"]=> array(1) { [0]=> array(8) { ["cui"]=> int(655485) ["data"]=> string(10) "2017-04-21" ["name"]=> string(13) "Example SA" ["address"]=> string(64) "JUD. NEAMT, SAT ROMEDC ALEXANDRE COM. COMENKA, STR. EXAMMS RANTEM, NR.6" ["tva"]=> bool(true) ["data_sfarsit"]=> string(1) " " ["data_anul_imp"]=> string(1) " " ["mesaj"]=> string(31) "platitor de TVA la data cautata" } } ["notfound"]=> array(0) { } } Array ( ) 

Donc ce que je veux, c'est extraire de ['address'], le mot après 'JUD .'-- (ce serait NEAMT, puis je veux les mots après' SAT '- (ce serait {{ X1}}, alors je veux les mots après 'COM.' - (ce serait COMENKA) puis je veux les mots après 'STR.' - (ce serait EXAMSS RANTEM).

Fondamentalement, à partir d'une chaîne 'adresse', je veux mettre chaque info dans des colonnes séparées (STR étant Street, NR. Étant le numéro de la maison, SAT serait le village / ville)

De plus, «adresse» aura des chaînes différentes à chaque fois, comme «BL». (bâtiment) ou «AP». - numéro d'appartement (toutes les adresses n'ont pas de numéro AP).

Comment puis-je réaliser ce que je veux? Je vous remercie.

0
an4rei 21 avril 2017 à 13:32

3 réponses

Meilleure réponse

Espérons que cela va vous aider..

Essayez cet extrait de code ici

<?php
$string='JUD. NEAMT, SAT ROMEDC ALEXANDRE COM. COMENKA, STR. EXAMMS RANTEM, NR.6';
$result=preg_split("/(?:JUD.\s*|\s*SAT\s*|\s*COM\.\s*|\s*STR.\s*)/", $string);

array_walk($result,function($value,$key) use (&$result){
    if(stristr($value, ","))
    {
        $result[$key]=explode(",", $value)[0];
    }
});
print_r(array_filter($result));
1
Sahil Gulati 21 avril 2017 à 11:26

J'aimerais en savoir plus sur les variations possibles de votre contribution. Veuillez étendre votre question pour inclure 4 ou 5 possibilités différentes afin que je puisse tester / affiner mon processus.

Contribution:

$string='JUD. NEAMT, SAT ROMEDC ALEXANDRE COM. COMENKA, STR. EXAMMS RANTEM, NR.6';

Méthode (Démo):

$all_markers=['JUD.','SAT','COM.','STR.','NR.','BL.','AP.'];     // list all possible markers
$escaped_markers=preg_replace('/\./','\.',$all_markers);         // prepare dots for regex pattern

$pattern='/(?<= |^)(?:'.implode(' ?|',$escaped_markers);         // declare all markers as match start points
$pattern.=' ?).*?(?= '.implode('| ',$escaped_markers).'|$|,)/';  // declare all match end points

if(preg_match_all($pattern,$string,$out)){
    foreach($out[0] as $pair){
        list($key,$val)=preg_split('/(?:'.implode('|',$escaped_markers).')\K ?/',$pair,2);
        $result[$key]=$val;
    }
    $desired_markers=['JUD.'=>'','SAT'=>'','COM.'=>'','STR.'=>''];  // list as keys the marker=>data you want
    $result=array_intersect_key($result,$desired_markers);        // filter out undesired marker=>data
    var_export($result);
}else{
    echo '$pattern failed';
}

Production:

array (
  'JUD.' => 'NEAMT',
  'SAT' => 'ROMEDC ALEXANDRE',
  'COM.' => 'COMENKA',
  'STR.' => 'EXAMMS RANTEM',
)

Étant donné que vous dites que les valeurs souhaitées dans la chaîne peuvent être dans n'importe quel ordre, il est nécessaire de capturer le mot-clé / marqueur afin de pouvoir associer avec précision les valeurs à son marqueur. N'est-ce pas vrai?

0
mickmackusa 20 mai 2017 à 16:03
$str = "JUD. NEAMT, SAT ROMEDC ALEXANDRE COM. COMENKA, STR. EXAMMS RANTEM, NR.6";

$JUD = substr($str, strpos($str, "JUD. "), strpos($str, ", SAT") );
$SAT = substr($str, strpos($str, ", SAT "), strpos($str, ", STR.") );
$STR = substr($str, strpos($str, ", STR. "), strlen($str) );
0
Asylzat Azaev 21 avril 2017 à 10:42