首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP &正则表达式:关键字只出现一次

PHP &正则表达式:关键字只出现一次
EN

Stack Overflow用户
提问于 2011-01-16 23:49:18
回答 4查看 1.3K关注 0票数 1

如何确保某个关键字在使用正则表达式的输入中只出现一次?

我认为下面的表达式中有一些错误,因为我可以重复相同的关键字,

代码语言:javascript
运行
复制
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."/>';
    }

我只希望这是真的,

代码语言:javascript
运行
复制
form.php?category=something or form.php?

但不是这个,

代码语言:javascript
运行
复制
form.php?.php?category=something or form.php?.php?

请告诉我怎么修。

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-16 23:53:14

你在正确的轨道上。您需要在regext中为特殊字符留空格。那个?是一个特殊字符,应该使用\?进行转义,并且点也应该使用斜杠进行转义。

最后,您不应该使用\b选项,它不适用于您的情况。

尝试:

代码语言:javascript
运行
复制
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."/>';
}
票数 1
EN

Stack Overflow用户

发布于 2011-01-16 23:56:47

试试preg_match_all,它返回字符串中出现的次数。

代码语言:javascript
运行
复制
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

但是,如果我编写这段代码,我就会完全避免使用正则表达式。喜欢

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2011-01-17 00:00:14

正如德米特里所说,你需要更多的逃脱。

正则表达式中的{1}不能确保一个模式在整个主题中只出现一次。它只是前一个字符串的量词。

否则,手动检查匹配的频率:

代码语言:javascript
运行
复制
preg_match_all("/(\.php\??)/", $str, $m);
$matched_once = count($m[1]) == 1;

如果要验证整个字符串,则必须指定完整的模式。使用^$。例如,在您的案例中:

代码语言:javascript
运行
复制
 preg_match("/\.php(\?[^?]*|)$/", $str)

它要么匹配.php?... (除了问号之外的所有内容),要么在最后只匹配.php ($在正则表达式中标记结尾)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4706309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档