0

これは不十分な質問かもしれませんが、私は正規表現の初心者です。次の形式のテキスト データがあります。

会社名: 会社の名前、場所。
会社の住所: Some, address, here.
リンク: http://www.somelink.com

ここで、正規表現を使用して、これらを name : value ペアの配列に分割したいと思います。私が試している正規表現は最初の 2 行/(.*):(.*)/preg_match_all()うまく機能しますが、3 行目では "Link: http:" を返し、別の部分で "//www.somelink.com" を返します。

それで、文字「:」の最初の出現でのみ行を分割する方法はありますか?

4

2 に答える 2

1

否定された文字クラスを使用します ( rubular.com を参照):

/^([^:]*):(.*)$/m

文字クラス[…]です。likeは、小文字の母音のいずれかと一致します。否定文字クラスです。小文字の母音以外のいずれかに一致します。[aeiou][^…][^aeiou]

パターンの最初と最後にある と は、行^アンカー開始と終了です。修飾子は、マルチライン モードをオンにします$m

.元のパターンの問題は、もっと具体的にすることができたときに(ab) を使用していること*です。繰り返しを消極的にすることによってそれを「修正」しようとするのは魅力的ですが、より具体的に言って、最初のグループが:.

ただし、これはキャプチャを使用した一致パターンであることに注意してください。実際には、区切り記号のみに一致する分割パターンではありません。区切り文字のパターンは本当に:.

関連する質問


PHP スニペット

これを考えると:

$text = <<<EOT
Company Name: Name of the company, place.
Company Address: Some, address, here.
Link: http://www.somelink.com
EOT;

preg_match_all('/^([^:]*):(.*)$/m', $text, $matches, PREG_SET_ORDER);

print_r($matches);

出力は次のとおりです ( ideone.com で見られるように):

Array
(
    [0] => Array
        (
            [0] => Company Name: Name of the company, place.
            [1] => Company Name
            [2] =>  Name of the company, place.
        )

    [1] => Array
        (
            [0] => Company Address: Some, address, here.
            [1] => Company Address
            [2] =>  Some, address, here.
        )

    [2] => Array
        (
            [0] => Link: http://www.somelink.com
            [1] => Link
            [2] =>  http://www.somelink.com
        )

)
于 2010-08-13T18:57:54.037 に答える
0

おそらく次のようなものが必要です/(.*?):(.*)/?after はそれ*を「貪欲ではない」ものにするので、そのようにできるだけ少ないテキストを消費します。私はそれがあなたの状況に役立つと思います。デフォルトで*は、「貪欲」であり、できるだけ多くの繰り返しに一致しようとします。

編集: and演算子を使用した一致の繰り返しの詳細については、こちらを参照してください。*+

于 2010-08-13T18:52:06.533 に答える