1

私は次の可能な文字列を持っています:

NL DE 
NL,DE
nl DE
nl de
NL/DE
NL,mismatch,DE

preg_match上記の入力を前提として、次の出力を生成するを探しています。

array(
  [0]=>"NL",
  [1]=>"DE"
);

私は次のコードを試しました:

preg_match_all('/(\w{2,2})/ui', $info["country"], $m);

mismatchしかし、それはまた、望ましくない単語を切り詰めているようです。

正規表現は2文字の国コードにのみ一致する必要があり、それ以外はすべて無視する必要があります。

preg_matchPHPでこれを行うにはどうすればよいですか?

4

3 に答える 3

4

文字列を分解する方法は次のとおりです。

$string = 'NL DE 
NL,DE
nl DE
nl de
NL/DE
NL,mismatch,DE';

explodeおよびを使用するfilter

$string = explode("\n",str_replace(array(",","/"," ","\r"), "\n", strtoupper($string)));
$string = array_unique(array_filter($string,function($v){$v = trim($v); return strlen($v) === 2;}));
var_dump($string);

文字列をいじりたい場合は、次のことを試してください。

$s = ",\n\t \r";
$t = strtok(strtoupper($string), $s);
$l = array();
while ( $t !== false ) {
    in_array($t, $l) OR strlen($t) == 2 AND $l[] = $t AND $t = strtok($s);
}
var_dump($l);

出力:

array
  0 => string 'NL' (length=2)
  1 => string 'DE' (length=2)
于 2012-10-19T15:48:34.957 に答える
3
// @claudrian Variant
function SplitCountries($string){
    // Sanity check
    if(!is_string($string)) return false;
    // Split string by non-letters (case insensitive)
    $slices = preg_split('~[^a-z]+~i', trim($string));
    // Keep only 2-letter words
    $slices = preg_grep('~^[a-z]{2}$~i', $slices);
    // Keep uniques
    $slices = array_unique($slices);
    // Done
    return $slices;
}

// @Wiseguy Variant
function SplitCountries($string){
    // Sanity check
    if(!is_string($string)) return false;
    // Capture only two letter packs
    if(!preg_match_all('~\\b[a-z]{2}\\b~i', trim($string), $slices)){
        return false;
    }
    // Keep uniques
    $slices = array_unique($slices[0]);
    // Done
    return $slices;
}

それが役に立てば幸い。

于 2012-10-19T15:46:12.620 に答える
1

これはうまくいくはずです

$result = array();
preg_match_all('/([a-z]{2})(?:.*)?([a-z]{2})/i',$text, $matches);
$result = array( strtolower( $matches[1][0] ), strtolower( $matches[2][0] ) );

$result配列に結果が表示されます

于 2012-10-19T15:49:55.123 に答える