2011-12-27 12 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 

私が抽出したい:PRIMARYから

  1. ID、UNIQUEから
  2. UNIK、
  3. comp_unik1とcomp_unik2 UNIQUE

から次のように:

  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をキャプチャし、あなたはすでに$1上で行うようexplodeを使用しています。

+0

ありがとうございます!あなたの答えとこれとの差(結果)は?\ w + \ s +(?:PRIMARY KEY | UNIQUE)INDEX \((*?)\) – Iyas

+0

はい。 1つは、あなたは外側の括弧を逃れることはできません。これはあなたがマッチしないことを意味します。そして、あなたがそれらをエスケープするならば、あなたの正規表現は、正規表現エンジンが最後の括弧を見つけるために_each_文字を先読みする必要があることを意味するので、正規表現は実行されません。それを行う。 – fge

+0

もう一度ありがとうございます。あなたはregexのスキルを向上させるために、本/チュートリアル/ Web /を提案できますか? – Iyas