2

正規表現は私の得意分野ではなく、この状況で少し苦労しています。

次の文字列があります。

locale (district - town) [parish]

次の情報を抽出する必要があります: 1 - ロケール 2 - 地区 3 - 町

そして、私はこれらの解決策を持っています:

1 - ロケール

preg_match("/([^(]*)\s/", $input_line, $output_array);

2 - 地区

preg_match("/.*\(([^-]*)\s/", $input_line, $output_array);

3 - 町

preg_match("/.*\-\s([^)]*)/", $input_line, $output_array);

そして、これらはうまくいくようです。ただし、文字列は次のいずれかのように表示される場合があります。

localeA(localeB) (district - town) [parish]
locale (district - townA(townB)) [parish]
locale (district - townA-townB) [parish]

ロケールには、独自の括弧を含めることもできます。タウンには、括弧および/または独自のハイフンを含めることができます。

これにより、適切な情報を抽出することが困難になります。上記の 3 つのシナリオでは、以下を抽出する必要があります。

localeA(localeB) + 地区 + 町

ロケール + 地区 + 町 A(町 B)

ロケール + 地区 + 町 A-町 B

これらすべてのシナリオに対処するのは難しいと思います。あなたは私を助けることができます?

前もって感謝します

4

2 に答える 2

0

ルールとエッジケースが正確に何であるかはわかりませんが、これは提供されている例では機能します

preg_match('#^(.+?) \((.+?) - (.+?)\) \[(.+)\]$#',$str,$matches);

次の結果が得られます ( の各サンプル文字列に対して実行した場合$str):

Array
(
    [0] => locale (district - town) [parish]
    [1] => locale
    [2] => district
    [3] => town
    [4] => parish
)

Array
(
    [0] => localeA(localeB) (district - town) [parish]
    [1] => localeA(localeB)
    [2] => district
    [3] => town
    [4] => parish
)

Array
(
    [0] => locale (district - townA(townB)) [parish]
    [1] => locale
    [2] => district
    [3] => townA(townB)
    [4] => parish
)

Array
(
    [0] => locale (district - townA-townB) [parish]
    [1] => locale
    [2] => district
    [3] => townA-townB
    [4] => parish
)
于 2013-08-21T09:15:59.393 に答える