1

文字列でより複雑な正規表現と preg_split を使用して、すべての一致の配列を取得し、区切り文字を保持しようとしています。通常、これは簡単ですが、PREG_SPLIT_DELIM_CAPTURE を使用しようとして、正規表現で複数の括弧のセットを使用するのは難しいことがわかっています。詳しく説明します:

行内の IP アドレスを解析し、行全体を配列に分割して、具体的には IP のみで何かを実行できるようにしたいのですが、最終的に行全体を表示したい (私は IP にフォーマットを適用してから再-文字列の組み立てと表示)。そのための私の正規表現はこれです(IPのように見えるものをチェックしますが、有効性はチェックしません。この時点では気にしません):

(((\d{1,3})\.){3}(\d{1,3}))

今のところ、私のコードは次のとおりです。 $ipv4regex = "/(((\d{1,3}).){3}(\d{1,3}))/";

if (contains_ipv4($line)){
    $pieces = preg_split($ipv4regex, $line, 0, PREG_SPLIT_DELIM_CAPTURE);
    print "<pre>";
    print_r($pieces);
    print "</pre>";
}

function contains_ipv4($val){
    return (preg_match($ipv4regex, $val));
}

そして、これが私の出力のサンプルです(IPアドレスは変更されましたが、まだ関連しています):

Array
(
    [0] => show arp results from 
    [1] => 10.10.15.120
    [2] => 15.
    [3] => 15
    [4] => 120
    [5] => 
)

出力が次のようになるように変更するにはどうすればよいですか。

(
    [0] => show arp results from 
    [1] => 10.10.15.120
    [2] => 
)

基本的に、PREG_SPLIT_DELIM_CAPTURE の正規表現で最も外側の括弧のみをキャプチャし、内側の括弧はキャプチャしたくありません。この特定のケースに合わせて正規表現を変更できることはわかっていますが、多くの括弧を使用した「適切な」IPv6 正規表現を持っているため、外側。誰か助けてくれませんか?私はそれを大いに感謝します。または、私が見逃しているまったく別の手段がある場合は、遠慮なくその方向に向けてください.

4

2 に答える 2

0

メソッドの全体的な混乱を減らし、数行のコードのみを使用するように改善しました。

if (preg_match($ipv4regex, $line)){
    $line = preg_replace_callback($ipv4regex, 'add_ipv4_p', $line);
}

後で行を出力しますが、正規表現チェックに必要なのはこの単純なビットだけです メソッド add_ipv4_p は、渡された配列の最初の要素にフォーマットを適用するために使用するメソッドです。単純。このスニペットを再利用し、正規表現とフォーマット方法を変更するだけで、コードにフォーマット オプションを追加することができました。

于 2012-08-30T14:05:21.217 に答える
0

?:開き括弧の直後に追加することで、括弧のキャプチャを非アクティブ化できます。たとえば、次のようになります。

((?:(?:\d{1,3})\.){3}(?:\d{1,3}))
于 2012-08-29T15:18:16.077 に答える