2010-04-09 37 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/>"); 

?> 
相關問題