両方の長さが可変であるStringB
かどうかをどのように確認できますか?StringA
9 に答える
PHPには、他の言語のようなStartsWith()はありません。別の方法として、次を使用できますmb_strpos()
。
if(mb_strpos($source, $start) === 0)
独自のStartsWith()関数を作成できます。
function StartsWith($source, $start)
{
return (mb_strpos($source, $start) === 0);
}
マルチバイト文字列関数を使用することを強くお勧めします。このようにして、PHPがUnicodeを完全にサポートする2025年よりずっと前にUnicode文字列を操作できます;-)。
substr($StringB, 0, strlen($StringA)) == $StringA
strposを使ってみませんか?(http://php.net/strpos)
if (strpos($stringB, $stringA) === 0) {
// matched
}
使用する:
strcmp() / strcasecmp()
長さが異なるかどうかを考慮し、最小の長さまでのみ比較します。
http://php.net/manual/en/function.strcmp.php
また:
substr_compare()
StringBがStringAで始まるかどうかを比較する必要があり、その逆ではないことを確認する必要がある場合(StringBの方が短い場合)。
http://www.php.net/manual/en/function.substr-compare.php
上記の関数はどちらも高速で、最短の文字列を1回だけ繰り返します。
とは対照的に:
strpos()
これは、StringAが開始する位置を返すために、 StringB内の任意の場所でStringAを検索しようとします。
preg_match
または、よりコストのかかる操作であり、多くのことをチェックする必要がある状況で使用する必要がある他の正規表現
正規表現エンジンは正規表現文字列をコンパイルする必要があり、一致するものを見つけるために多くのバックトラックと文字列のループを使用します。
$pos = strpos($StringB, $StringA)
$ posが1または0の場合(どちらかは忘れます)、文字列Bは文字列Aで始まることがわかります。
編集:それは位置0です。
そのためにstrposを使用してください...
if(strpos($stringB, $stringA) === 0) {
// starts with stringA
}
答えはすでに受け入れられていますが、残念ながら php の性質上、次の方法が唯一の正しい方法です: usestrncmp()
または===
. 理由は次のとおりです。
次の入力例を考えてみましょう (両方の文字列は最後の数字を除いて同じです)。
$StringA = '9223372036854775808';
$StringB = '9223372036854775807';
ここで、次の解決策を取ります。
var_dump(substr($StringB, 0, strlen($StringA)) == $StringA);
戻り値を推測できますか? これは:
true
待って、なに、どうして!? 理由は次のとおりです: https://bugs.php.net/bug.php?id=54547
PHP は通常、外部文字列が数値であっても、ほとんどのデータを外部文字列から取得します。そのため、コードが を読み取っ$_POST['key'] == 123
て$_POST['key']
実際'123'
に である場合でも、PHP は等値を計算する前に文字列を整数に型キャストするため、引き続き機能します。
$_GET['key'] == $_POST['key']
両方の文字列に数字が含まれていると仮定すると、 にも同じことが言えます。そしてここにキッカーがあります:
PHP は、比較の前に文字列が最初に数値に見えるかどうかを判断します。ただし、数値が大きくなりすぎると、オーバーフローして a
double
になり、精度が失われます。これにより、比較で予期しない結果が返されます。
代わりに、文字列を比較するには、非常に明示的にする必要があります。
// use strncmp() - the === here is not really necessary btw
var_dump(0 === strncmp($StringB, $StringA, strlen($StringA)));
// use === to perform the comparison in a strict manner
var_dump(substr($StringB, 0, strlen($StringA)) === $StringA);
戻り値:
false
false
正常性が回復しました:)
あなたは試すことができます:
if(preg_match('/^'.preg_quote($stringA).'.*/', $stringB){ do some stuff }
これにより、文字列のサイズに関係なく、BがAで始まるかどうかがチェックされます。
編集:良い点が持ち上がった。正規表現の特殊文字が含まれている可能性のある文字列でpreg_matchを使用する場合は、正規表現で文字列を使用する前に、preg_quote($ string)を使用してそれらがエスケープされていることを確認してください。
このようなものはどうですか?
if (strlen($b) < strlen($a)) {
//does not match
}
$len = strlen($a);
if (substr($b, 1, $len) == $a) {
//matches
}