1

文字列がUS、DS、UCS、またはDCSの文字で始まるかどうかを調べようとしています。

不必要に長いifステートメントを実行するのと同じくらい魅力的でしたが、もっと良い方法があると思いました。正規表現を使用してこれを実行しようとしましたが、喜びはありませんでした。

$string = 'USQWERTY';
if(preg_match_all('|(US|DS|UCS|DCS)|', $string) // do something

常にfalseが返されますが、ワイルドカードを使用していないためかどうか疑問に思います。各単語の後に*を使用してみましたが、残念ながらそれも喜びではありませんでした。

これについてのアドバイスを本当にいただければ幸いです、ありがとう!

4

5 に答える 5

6

別の区切り文字を使用する必要があります:

'/(US|DS|UCS|DCS)/'

私はあなたがこれを言ったことにも気づきました:

文字列がUS、DS、UCS、またはDCSの文字で始まるかどうかを調べようとしています。

使用している正規表現は、文字列内の任意の場所でこれらの文字と一致します。また、文字列の先頭でのみ一致するように、文字列の先頭アンカーを使用する必要があります。

'/^(US|DS|UCS|DCS)/'

preg_matchまた、閉じ括弧がなく、の代わりに使用したいようですpreg_match_all

if (preg_match('/^(US|DS|UCS|DCS)/', $string))
于 2012-06-14T16:24:55.247 に答える
5

まず、必要なのが1つの一致である場合、preg_match_allは実際には必要ありません。preg_matchで十分です。

次に、パイプシンボルをグローバルパターン区切り文字として使用する場合は、パターン自体の中でそれをエスケープする必要があります。通常のスラッシュ記号を選択する方が簡単です。)。

最後に、文字列が(一連の文字で)始まるときにのみ一致する必要がある場合は、正規表現をわずかに変更する必要があります。

if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { ... }

この例では私のために働きます:

<?php

$string = 'USdsa';
if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { 
  echo 'Matched!'; 
}

$string = 'DCSda';
if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { 
  echo 'Matched again!'; 
}

$string = 'EWDS';
if (! preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { 
  echo 'Not matched!'; 
}

?>
于 2012-06-14T16:28:43.487 に答える
1

パイプはORを意味するため、これを最初と最後から削除し、大文字と小文字を区別しないようにする必要があります

/^(US|DS|UCS|DCS)/gi
于 2012-06-14T16:26:22.873 に答える
1

問題は、PCREパターンを区切り文字で囲む必要があり、パターン内に区切り文字を含めたい場合は、それをエスケープする必要があるということです。

したがって、正規表現を次のいずれかに変更すると、機能するはずです。

  • '/(US|DS|UCS|DCS)/'
  • '|(US\|DS\|UCS\|DCS)|'

PCRE区切り文字として正規表現内で多くの意味を持つ記号を使用するのは面倒なので、最初の形式を強くお勧めします。

于 2012-06-14T16:27:34.757 に答える
1

私は正規表現の専門家ではありません。主な理由は、それが私からbeejeebusを混乱させるだけだからです。私はあなたをチェックできるこの関数を本当に速く書きました。

  function searchMultiple($n, $h) {
    for ($i = 0; $i < count($n); $i++) {
        if (stripos($h, $n[$i]) !== false) return TRUE;
    }
  }

  $needles = array("US","DS","UCS","DCS");
  $haystack = "We are looking for one of our needles in here, like maybe 'US'";
  searchMultiple($needles, $haystack);
于 2012-06-14T16:34:43.187 に答える