Düzenli ifade ile sorgu dizesinde etiketlerini bulmakta

3 Cevap php

I have to set some routing rules in my php application, and they should be in the form /%var/something/else/%another_var

Diğer bir deyişle i bana% karakteri ile işaretlenmiş her URI parça döndüren bir regex beed hemen hemen her dize olabilir, bu yüzden% ile işaretlenmiş Dize var adları gösterir.

another example: from /%lang/module/controller/action/%var_1 i want the regex to extract lang and var_1

i gibi bir şey denedim

/.*%(.*)[\/$]/

ama çalışmıyor .....

3 Cevap

Bu kurallar yönlendirme, ve bazı noktada bütün parçaları gerekebilir olarak gören, aynı zamanda dize klasik yolu bölünmüş olabilir:

$path_exploded = explode("/", $path);
foreach ($path_exploded as $fragment) if ($fragment[0] == "%") 
  echo "Found $fragment";

I () gereken her şeyi yapmak trim () ve patlayabilir ... bir regex ile komut yavaşlatmak için gerek görmüyorum:

function extract_url_vars($url)
{
    if ( FALSE === strpos($url, '%') )
    {
        return $url;
    }

    $found = array();
    $parts = explode('/%', trim($url, '/') );

    foreach ( $parts as $part )
    {
        $tmp     = explode('/', $part);
        $found[] = ltrim( array_shift($tmp), '%');
    }

    return $found;
}

// Test
    print_r( extract_url_vars('/%lang/module/controller/action/%var_1') );

// Result:
Array
(
    [0] => lang
    [1] => var_1
)

Sen kullanabilirsiniz:

$str = '/%lang/module/controller/action/%var_1';    
if(preg_match('@/%(.*?)/[^%]*%(.*?)$@',$str,$matches)) {
        echo "$matches[1] $matches[2]\n"; // prints lang var_1    
}