我有一些格式为
的数据C222 = 50
C1234P687 = 'some text'
C123YYY = 'text'
C444 = 89
C345 = 3
C122P687 = 'some text'
C122YYY = 'text'
....
....
所以基本上有3种不同的形式
只有数字在(=)符号的左侧具有可变长度。价值观各不相同。
我想将数据存储在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 :(得分:5)
在PHP中使用正则表达式。以下正则表达式模式将匹配您提供的所有情况 - 将其与preg_match_all一起使用(传入数组并PREG_SET_ORDER
),然后传入的数组将包含每行数据的数组,每行的数组将包含5个元素。
(C[\d]+)(P[\d]+)?(YYY)? = (.+)
数组的第一个元素将包含已测试的完整字符串。
数组的第二个元素将包含“C”数字。
如果存在,则数组的第三个元素将包含“P”数字,否则它将为空白。
如果存在,则数组的第四个元素将包含“YYY”,否则它将为空白。
数组的第五个元素将包含值。
在回复之前的评论时,以下正则表达式是上述修正版的修改版,但不会在匹配的值中包含C
和P
:
C([\d]+)(?:P([\d]+))?(YYY)? = (.+)
答案 1 :(得分:3)
我假设数据是从文件中读取的,因此请使用file_get_contents
或fopen
之类的内容。
对于数据,常规表达式是最好的选择..
查看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;
表达感谢:Andy Shellam
答案 2 :(得分: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/>");
?>