Php Tescil exp: Eşleştirme yinelenen desen

3 Cevap php

Ben aşağıda olduğu gibi dizeleri maç istiyorum.

abc|q:1,f:2
cba|q:1,f:awd2,t:3awd,h:gr

Ben php kullanıyorum ve bu ifade ile her iki preg_match ve preg_match_all denedim.

/^([a-z]+)\|([a-z]+:[a-z0-9]+,?)+$/iU

Bu sadece boru önceki ilk kısmı ile döner, ve bir a: 1. Neyi yanlış yapıyorum, neden bu şekilde davrandığını ve nasıl çalışır yapabilir?

3 Cevap

/^([a-z]+)\|((?:[a-z]+:[a-z0-9]+,?)+)$/iU

yakalamak:

  • Borunun önce kısım
  • bölümünden sonra bölüm

'+' Ve açgözlü doğası quantifier sizin yakalama grubunu (? [Az] + [a-z0-9] +) yapmak sadece bu regex eşleşen karakterler son seti yakalamak.

/(?ms)^((?:[a-z]+)\|(?:[a-z]+:[a-z0-9]+,?)+)$/iU

Tüm çizgi yakalamak istiyorum.

Önlemek için '?:' Not creating any capturing group.

Ben sadece denedim:

<?php
$string = 'cba|q:1,f:awd2,t:3awd,h:gr';
$subpat = '[a-z]+:[a-z0-9]+';
$pat = "/^([a-z]+)\|($subpat(?:,$subpat)+)$/i";
preg_match( $pat, $string, $matches );
print_r( $matches );
?>

hangi verimleri

Array
(
    [0] => cba|q:1,f:awd2,t:3awd,h:gr
    [1] => cba
    [2] => q:1,f:awd2,t:3awd,h:gr
)

Bu noktada matches[1] olarak dikey çubuk ve matches[2] içinde kalanı önce parçası var. Tekrarı $subpat dizeleri doğru virgülle ayrılmalıdır sağlamak için vardır. Bundan sonra, explode üzerine matches[2] geçerlidir.

$string = 'cba|q:1,f:awd2,t:3awd,h:gr';

$re = '~(?:  ^(\w+)\| ) | (?: (\w+) : (\w+) (?:,|$) )~x';
preg_match_all($re, $string, $m, PREG_SET_ORDER);
var_dump($m);

Bu borunun ("kurşun") ve bir kerede tüm anahtar-değer çiftleri önce bölümünü maç olacak. "Öncü" $m[0][1] olacak ve anahtar değerler olacaktır $m[1..x][2] and [3]. Örneğin, bir durunda bu dönüştürmek için bazı basit sonrası işleme ekle:

$lead = $m[0][1];
foreach(array_slice($m, 1) as $p)
    $data[$p[2]] = $p[3];
var_dump($lead, $data);