2016-08-23 7 views
0

文字列がコンマで区切られた別の文字列であるかどうかを確認したいと思います。私はいくつかのコードを書いたし、このように動作します...PHPで正規表現 '数字に一致しません'

$find_number = '3' 
$string_to_search = '1,3,124,12' 
preg_match('/[^0-9]'.$find_number.'[^0-9]/', string_to_search); 
//match 

$find_number = '4' 
$string_to_search = '1,3,124,12' 
preg_match('/[^0-9]'.$find_number.'[^0-9]/', string_to_search); 
//not match 

これは私が期待したものです。問題は、この式で最初と最後の文字列を認識できないことです。私は何を間違えたのですか?

+1

あなたの変数の始めに '$'を忘れてしまったようです。 – roberto06

+2

なぜ* preg_match *を使用しましたか?爆発し、配列の比較はあなたのケースでは多くの出演者です... – donald123

+1

'$'だけがここでのトラブルではありません。 –

答えて

2

あなたは$find_numberの両側には数字がないかどうかを確認することを確認する必要がある、とあなたはあなたができるように一致させる必要がある番号の前と後のテキストを消費しない(?<!\d)/(?!\d)前後参照を必要とする理由です最初と最後の項目をチェックします。あなたのパターンの[^0-9]の文字クラスのインスタンスで、find_numberの前後に数字以外の文字が必要です。 ((?<!\d)負のlookbehind)前または後((?!\d)否定先読みの場合)の数字がのfind_numberの場合、ルックアラウンドは一致に失敗します。下記を参照:

$find_number = '3'; 
$string_to_search = '1,3,124,12'; 
if (preg_match('/(?<!\d)'.$find_number.'(?!\d)/', $string_to_search)) { 
    echo "match!"; 
} 

PHP demoを参照してください。

代替はin_arrayexplodeを使用することです:

$find_number = '3'; 
$string_to_search = '1,3,124,12'; 
if (in_array($find_number, explode(",", $string_to_search))) { 
    echo "match!"; 
} 

あなたはこのような単純なタスクのための正規表現を必要としないanother PHP demo

+1

または単に '\ b3 \ b' – revo

+0

はい、この文脈では、単語境界を使用することもOKです。一般的に言えば、桁と非桁の単語境界の境界をより一般的にチェックする適切なゼロ幅アサーションです。 –

+1

またはこれと逆の場合もあります。* – revo

3

を参照してください。 $find_numberにセパレータが含まれていない場合は、$find_number$string_to_searchを区切り文字で囲み、strpos()ファンクションを使用して、$find_numberが存在するかどうかを確認します。$string_to_searchstrpost()は、preg_match()よりはるかに高速です。セパレータで

$find_number = '3'; 
$string_to_search = '1,3,124,12'; 

if (strpos(",{$string_to_search},", ",{$find_number},") !== FALSE) { 
    echo("{$find_number} is present in {$string_to_search}"); 
} else { 
    echo("No."); 
} 

ラッピング$find_numberは、部分的な値を求めるセパレータで$string_to_searchは、それが最初か$string_to_searchの最後のエントリであるとき、それは$find_numberをご覧いただくことが必要とされているラップ、それを避けるために必要とされます。

+0

@revoどういう意味ですか? '$ find_number'が'!== FALSE'のため '1'のときにうまく動作します。 – axiac

+0

いいえ、私は何か他のことを意味しましたが、追加のカンマを認識していませんでした。 Upvoted。 – revo

関連する問題