2012-01-03 35 views
0

之間找我有一個字符串,它看起來有點像正則表達式,也就是說

Name: xxx xxx 
Company Name: xxx xxx xx 
Company Type: xxxx 
Tel: xxxx 
Email: xxxxxxx 
Postcode: xxxxxx 

我試圖拔出XXX

我使用preg_match_all這樣做,但正則表達式,我需要是不是我能掌握:(我一直在閱讀各地的網絡各種教程,現在我明白這一切較少。

我相信我可以做類似

找到^姓名:(然後任何數量的字空格等到我到)公司名稱$然後^公司名稱:(然後任何數量的字空格等,直到我到)公司類型$

如果有人可以開始我,也許有一個小的解釋,以幫助我更多地理解事情,比如術語「匹配」,我如何定義什麼是匹配和什麼被忽略,因爲我只想要一個數組中的xxx部分,所以如果我做了^名稱:[a-zA-Z0-9] $將全部是匹配或只是[]中的位。

問候。

編輯:添加我使用的php代碼。

foreach($value as $k => &$v){ 
    if($k == "history_date_created"){ 
     $v = date("D jS M Y @ H:i:s", strtotime($v)); 
    } 

    if($k == "history_text"){ 
     //Name: xxx xxxx Company Name: xxxx xxxx Company Type: xxxx xxxx Tel: xxxx xxxx Email: xxxx xxxx Postcode: xxxx xxxx To Email: xxxx xxxx Subscription: none 
     $pattern = "/Name: (.*) Company Name: (.*) Company Type: (.*) Tel: (.*) Email: (.*)/U"; 
     preg_match_all($pattern, $v, $matches, PREG_SET_ORDER); 
     print_r($matches); 
    } 
} 

基本上我已經從數據庫中抽取一排,遺憾的是「history_text」是一個文本字段,在我看來是存儲錯誤的,但我也沒有辦法,現在改變這種做法,需要正則表達式來拉不同的值,history_text字段是由表單創建的,所以「名稱:」「公司名稱:」等將永遠是相同的,每個值都不會並且是用戶輸入的,因此可以是任何內容,包括空白。

編輯我的回答:

沒有註冊防爆需要這就是我到底

foreach($value as $k => &$v){ 
    if($k == "history_date_created"){ 
     $v = date("D jS M Y @ H:i:s", strtotime($v)); 
    } 

    if($k == "history_text"){ 
     $matches = explode("\n", $v); 

     foreach($matches as $match){ 
      $boom = explode(":", $match); 
      $value[$boom[0]] = $boom[1]; 
     } 
    } 
} 

回答

1

試試這個:

preg_match_all("/Name: (.*) Company Name: (.*) Company Type: (.*) Tel: (.*) Email: (.*)/U", $x, $matches, PREG_SET_ORDER); 

一些注意這一點:

  • .捕捉任何單個字符 - 除了換行符(默認情況下,除了 換行符)
  • *將擴展它來捕捉多個字符
  • ()將捕獲那些在submatches你可以如果你想 進一步限制它也使用其他字符類。
  • U修飾符(在//之後)使匹配非貪婪。此 有助於避免。*與「控制文本」的部分匹配,例如 當你在一條線上有多個匹配時。
  • 參數PREG_SET_ORDER通常可以更方便地遍歷您可以訪問的matches數組,例如,由$matches[4][2]爲公司名稱 第五場比賽,而不是$matches[2][4]與默認模式排序。

編輯:我假設你知道實際的「描述條款」,如「公司名稱」,否則將不可能一般區分「(XXX XXX Company)Name:」和「(XXX XXX)Company名稱:「

另請注意,只需要一個preg_match來捕獲此」行「的單個實例,而preg_match_all將有助於捕獲多個」行「。

+0

你所做的一切確實對我有意義,但不幸的是它只返回空的空數組。我將在上面添加一段我的php代碼。 – 2012-01-03 11:59:10

+0

該模式適用於我使用您在提供正確數組的註釋中提供的字符串。 (雖然它不完整,我會離開添加郵政編碼等給你...)。但是,在XXX部分中不能有換行符,如果您需要添加's'修飾符。 – Zulan 2012-01-03 12:08:03

+0

啊我的錯誤,認爲事情變得最終變得簡單大聲了! 我向你展示了沒有nl2br的php輸出中的字符串,所以對我來說它似乎全部在一行上infact它並不是每個項目都在它自己的行上似乎是 – 2012-01-03 12:36:06

1

它看起來有點艱難和複雜的僅正則表達式來做到這一點做到了。但是你可以使用正則表達式來表示:(冒號)符號。

/[^:]*/

這會給你的每個冒號前的所有字符串。比你可以削減所有這些字符串的最後部分。例如。 If subpos of "Company Name:" !== FALSE,剪下該字符串的最後部分。這給你名字的價值。

您可以對其他零件使用相同的邏輯。

0

因爲在xxxx和公司名稱之間沒有分隔符,所以沒有真正的分隔數據的好方法。如果它是company_name,那麼這可能不是這樣的問題。

查看正則表達式解決方案,或使用「:」和空格「」使用爆炸函數(可能兩次)。

相關問題