2011-09-17 5 views
0

私がどのように見える文字列からデータを抽出する必要がありますPHPで正規表現を書いていますと、「オプション」サブストリングマッチング:正規表現

Naujasis Salemas、Šiaurėsダコタ
JungtinėsValstijos(Centras、Šiaurėsダコタ)

私が抽出したいと思います:

Naujasis Salemas
Centras

最初のケースでは、私は[^-]*(?=,)と書いてありますが、これは非常にうまくいきます。括弧(and)がある場合は、その括弧の間を検索してから、すべてをコンマの前に抽出するように式を修正したいと思います。

1つの式でこれを行うことはできますか?もしそうなら、どうすれば括弧の中に検索することができますか?

答えて

1

私はこの1つはそれを行うことができると思う:

[^-(]+(?=,) 

これは、あなたと同じ正規表現であるが、それはマッチした文字列中に括弧を許可していません。それは最初のサブジェクトでは引き続き一致し、2番目のサブジェクトでは、開始括弧の直後に一致します。

は、ここでそれを試してみてください:あなたはコンマに続くカンマや括弧を除く任意のテキストを、一致し

[^(),]+(?=,) 

を使用することができますhttp://ideone.com/Crhzz

+0

ありがとうございました!これは完全に機能しました:) – F21

1

2

conditionalはここであなたを助けるかもしれない:

$stra = 'Naujasis Salemas, Šiaurės Dakota'; 
$strb = 'Jungtinės Valstijos (Centras, Šiaurės Dakota)'; 

$regex = ' 
    /^     # Anchor at start of string. 
    (?(?=.*\(.+,.*\)) # Condition to check for: presence of text in parenthesis. 
     .*\(([^,]+)  # If condition matches, match inside parenthesis to first comma. 
     | ([^,]+)   # Else match start of string to first comma. 
    ) 
    /x 
'; 
preg_match($regex, $stra, $matches) and print_r($matches); 

/* 
Array 
(
    [0] => Naujasis Salemas 
    [1] => 
    [2] => Naujasis Salemas 
) 
*/ 

preg_match($regex, $strb, $matches) and print_r($matches); 

/* 
Array 
(
    [0] => Jungtinės Valstijos (Centras 
    [1] => Centras 
) 
*/ 

$matchesのインデックスがわずかに上記の変更ができますが、named subpatternsを使用していることを回避することができるかもしれないということ。

+1

Nice :)(正規表現でコメントするには、['x'修飾子(http://docs.php.net/manual/en/reference.pcre.pattern.modifiers.php)を使用できます直接);)) – arnaud576875

+0

ああ、ありがとう!私は正規表現のコメントをどこか他の人に見て誓ったことができました。それは私が私のために働くことができなかったという私を悩ましていました(: –