2010-04-09 87 views
3

我具有在如何检索在字符串中具有可变长度的字符的子字符串?

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

格式一些数据,以便基本上3种不同形式

  1. “C” 号=值,例如 - C444 = 89
  2. “C” 号 “P”数=值,例如 - C123P687 = '一些文本'
  3. “C” 号 “YYY”=值

ONL y数字在(=)符号的左侧具有可变长度。价值各异。

我想在DB中的数据存储为

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' 

任何想法如何获取这些数字?

感谢

+0

C122YYY是什么yyy? – zaf 2010-04-09 10:04:00

+0

@zaf ..对系统来说,这意味着C122项目也具有其他值。 YYY这里只是标识这个其他值的标签。 – user187580 2010-04-09 10:13:07

回答

5

使用正则表达式在PHP。以下正则表达式模式将与您提供的所有案例相匹配 - 与preg_match_all(传入数组并传入PREG_SET_ORDER)一起使用,并且传入的数组将包含每行数据的数组,每行数组将包含5元素。

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

该数组的第一个元素将包含测试完整的字符串。

该数组的第二个元素将包含“C”数字。

该数组的第三个元素将包含“P”编号(如果存在),否则将为空。

数组的第四个元素将包含“YYY”(如果存在),否则它将为空。

该数组的第五个元素将包含该值。

响应于较早的评论,以下正则表达式是上述的经修饰的版本,但将不包括在匹配的值的CP

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

+0

安迪,你是个明星!非常感谢你。 – user187580 2010-04-09 10:40:29

+0

yay,正则表达式! :) – knittl 2010-04-10 08:45:23

3

我假设的数据从文件中读取,所以使用类似file_get_contentsfopen

对于数据的正则表达式是您最好的选择..

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; 

REG表达感谢看一看到:安迪Shellam修改

+0

+1为逐行解析数据的建议 - 我在我的答案中假定整个数据都是单个变量。 – 2010-04-09 10:17:28

+0

是的,但我必须删除C,P使用substr。重新数据。我只是以数组块的形式接收这些数据。一次一个数组。并且我尝试在数组的每个条目上使用给定的正则表达式。谢谢 – user187580 2010-04-09 10:21:44

+0

参考使用substr删除C和P - 使用以下修改的正则表达式只抓取C和P组件中的数字:'C([\ d] +)(?: P([\ d] +))? (YYY)? =(。+)' – 2010-04-09 10:34:32

1

的溶液,而无需使用正则表达式:

<?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/>"); 

?> 
相关问题