如何确保某个关键字在使用正则表达式的输入中只出现一次?
我认为下面的表达式中有一些错误,因为我可以重复相同的关键字,
if (!preg_match('/\b(.php?){1}\b/', $cfg_path))
{
$error = true;
echo '<error elementid="cfg_path" message="PATH - make sure you have a \'.php?\' in the path."/>';
}
我只希望这是真的,
form.php?category=something or form.php?
但不是这个,
form.php?.php?category=something or form.php?.php?
请告诉我怎么修。
谢谢。
发布于 2011-01-16 23:53:14
你在正确的轨道上。您需要在regext中为特殊字符留空格。那个?是一个特殊字符,应该使用\?进行转义,并且点也应该使用斜杠进行转义。
最后,您不应该使用\b选项,它不适用于您的情况。
尝试:
if (!preg_match('/(\.php\?){1}/', $cfg_path))
{
$error = true;
echo '<error elementid="cfg_path" message="PATH - make sure you have a \'.php?\' in the path."/>';
}
发布于 2011-01-16 23:56:47
试试preg_match_all
,它返回字符串中出现的次数。
if ( preg_match_all ("~\.php\?~", $cfg_path, $match ) > 1 ){
$error = true;
echo '<error elementid="cfg_path" message="PATH - make sure you have a \'.php?\' in the path."/>';
}
有关preg_match_all
的更多信息,请单击此处PHP: preg_match_all - Manual
但是,如果我编写这段代码,我就会完全避免使用正则表达式。喜欢
if ( substr_count($cfg_path, ".php?") > 1 ){
$error = true;
echo '<error elementid="cfg_path" message="PATH - make sure you have a \'.php?\' in the path."/>';
}
有关substr_count
的更多信息,请点击此处:PHP: substr_count - Manual
发布于 2011-01-17 00:00:14
正如德米特里所说,你需要更多的逃脱。
正则表达式中的{1}
不能确保一个模式在整个主题中只出现一次。它只是前一个字符串的量词。
否则,手动检查匹配的频率:
preg_match_all("/(\.php\??)/", $str, $m);
$matched_once = count($m[1]) == 1;
如果要验证整个字符串,则必须指定完整的模式。使用^
或$
。例如,在您的案例中:
preg_match("/\.php(\?[^?]*|)$/", $str)
它要么匹配.php?...
(除了问号之外的所有内容),要么在最后只匹配.php
($
在正则表达式中标记结尾)。
https://stackoverflow.com/questions/4706309
复制相似问题