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

时间:2010-04-09 09:57:11

标签: php string

我有一些格式为

的数据
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 ='some text'
  3. “C”编号“YYY”=值
  4. 只有数字在(=)符号的左侧具有可变长度。价值观各不相同。

    我想将数据存储在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'
    

    如何检索这些数字?

    由于

3 个答案:

答案 0 :(得分:5)

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

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

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

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

如果存在,则数组的第三个元素将包含“P”数字,否则它将为空白。

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

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

在回复之前的评论时,以下正则表达式是上述修正版的修改版,但不会在匹配的值中包含CP

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

答案 1 :(得分: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;
表达感谢: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/>");

?>