2016-08-23 115 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

'$'s不是唯一的麻烦。 –

回答

2

你需要作出一定要检查是否有在$find_number两侧没有数字,这就是为什么你需要(?<!\d)/(?!\d) lookarounds不消耗文本之前和号码后,您需要匹配允许检查第一个和最后一个项目。您的模式中的[^0-9]否定字符类别实例,需要find_number前后的数字以外的字符。如果之前有一个数字((?<!\d)否定向后看)或之后(使用(?!\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

另一种方法是使用explodein_array

$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

是的,在这种情况下,甚至可以使用字边界。一般而言,将检查数字和非数字字边界之间的边界的合适的零宽度断言是更通用的。 –

+1

或反之亦然*在这种情况下,甚至可以使用lookarounds * – revo

3

你并不需要这样一个简单的任务正则表达式。如果$find_number不包含分隔符,则可以将$find_number$string_to_search都包含在分隔符中,并使用函数strpos()来确定$find_number是否存在于$string_to_search中。 strpost()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在分离器是需要让它找到$find_number当它是第一或$string_to_search中的最后一项。

+0

@revo你是什么意思?当'$ find_number'由于'!== FALSE'为'1'时它工作正常。 – axiac

+0

不,我的意思是别的,但没有意识到额外的逗号。 Upvoted。 – revo