使用一些预定义的单词从字符串中提取信息

时间:2017-04-21 10:32:46

标签: php arrays string

我猜这个标题非常抽象。

所以我有一些包含地址的数组(这是一个例子):

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 ( ) 

所以我想要的是从['地址'],JUD之后的单词中提取。' - (那将是NEAMT,然后我想要在' SAT'之后的单词(那将是ROMEDC ALEXANDRE,然后我想要在' COM之后的单词。' - (那将是COMENKA )然后我想要' STR。' - (那将是EXAMSS RANTEM)之后的单词。

基本上,来自地址'字符串,我想把每个信息放在不同的列中(STR是街道,NR。是房子的号码,SAT是村庄/镇)

此外,'地址'每次会有不同的字符串,例如' BL。' (建筑物)或' AP。' - 公寓号码(并非所有地址都有AP号码)。

我怎样才能实现我想要的目标?谢谢。

3 个答案:

答案 0 :(得分:1)

希望这会帮助你..

Try this code snippet here

<?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 :(得分:0)

$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) );

答案 2 :(得分:0)

我想更多地了解您输入的可能变化。请扩展您的问题以包括4或5种不同的可能性,以便我可以测试/改进我的过程。

输入:

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

方法(Demo):

$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';
}

输出:

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

因为您说字符串中的所需值可以按任何顺序排列,所以必须捕获关键字/标记,以便您可以准确地将值与其标记相关联。这不是真的吗?