2011-12-27 47 views
1

我從sp_helpconstraint iyas_grandtest獲取此信息。在Sybase ASE中發現主鍵/唯一鍵:正則表達式和PHP

constraint_name   definition 
iyas_grand_2317208971 PRIMARY KEY INDEX (id) : CLUSTERED 
iyas_grand_2317208972 UNIQUE INDEX (unik) : NONCLUSTERED 
iyas_grand_2317208973 UNIQUE INDEX (comp_unik1, comp_unik2) : NONCLUSTERED 

我想提取:從小學

  1. ID,從獨特的
  2. 的Unik,
  3. comp_unik1和comp_unik2從獨特的

如下:

  1. $鍵[] = ID
  2. $獨特[ 'iyas_grand_2317208972'] [] =場Unik
  3. $獨特[ 'iyas_grand_2317208973'] [] = comp_unik1
  4. $獨特[ 'iyas_grand_2317208973'] [] = comp_unik1

請注意,有時PRIMARY鍵可能是PRIMARY KEY INDEX(id,id2)。我現在有一個缺陷(只檢測1個組合鍵的鍵,如果有_則截斷名稱,即'comp_unik1'變成'comp')。

$sql = sybase_query("sp_helpconstraint iyas_grandtest");   
while($row = sybase_fetch_assoc($sql)) { 
      $txt= $row['definition']; 
      $re1='(PRIMARY)'; # Word 1 
      $re2='.*?'; # Non-greedy match on filler 
      $re3='(?:[a-z][a-z]+)'; # Uninteresting: word 
      $re4='.*?'; # Non-greedy match on filler 
      $re5='(?:[a-z][a-z]+)'; # Uninteresting: word 
      $re6='.*?'; # Non-greedy match on filler 
      $re7='((?:[a-z][a-z]+))'; # Word 2 

      if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5.$re6.$re7."/is", $txt, $matches)) 
      { 
       $word =$matches[2][0]; 
        $keys = explode(",", $word); 
      } 

    } 

回答

1

您可以嘗試搭配:

^\w+\s+(?:PRIMARY KEY|UNIQUE) INDEX \(([^)]+)\) 

的每一行,然後捕獲$1而這一點正是括號之間,並使用explode爲你$1已經這樣做了。

+0

謝謝!你的答案和這個^ \ w + \ s +(?: PRIMARY KEY | UNIQUE)INDEX \((。*?)\)有什麼區別(結果) – Iyas 2011-12-28 08:30:17

+0

是的。首先,你不會逃離外面的包袱,這意味着你不會有比賽。如果你確實逃避了它們,那麼你的正則表達式不會表現得很好,因爲你使用了一個懶惰的量詞,這意味着正則表達式引擎將不得不尋找_each_字符來查找關閉元素,而提供的正則表達式不必去做。 – fge 2011-12-28 09:59:01

+0

再次感謝。你能建議任何書籍/教程/網站/以幫助提高正則表達式技能? – Iyas 2011-12-29 00:32:17