字符串验证的正则表达式问题

时间:2016-02-24 14:55:30

标签: php regex

我正在尝试使用PHP中的正则表达式验证以下类型的字符串。使用PHP 5.5.9。

字符串采用以下格式:

/[sometext]/course/[sometext1]/[sometext2]

我需要的是一个正则表达式,它将接受仅采用该格式的字符串而不是其他内容。这意味着这些无效:

/aaa/course/bbb/ccc/
/aaa/course/bbb/ccc/ddd

到目前为止我所拥有的是:

/\/(?P<domain>.+?)\/course\/(?P<courseid>.+?)\/(?P<reportname>.+?)/

有什么想法吗?

更新

在所有海报的帮助下,特别是wiktor-stribi%c5%bcew,我得到了一个有效的:

 $regex = '#^/(?P<domain>[^/]+)/course/(?P<courseid>[^/]+)/(?P<reportname>[^/]+)$#';

2 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

^\/(?P<domain>[^\/]+)\/course\/(?P<courseid>[^\/]+)\/(?P<reportname>[^\/]+)$

PHP:

$re = '~^/(?P<domain>[^/]+)/course/(?P<courseid>[^/]+)/(?P<reportname>[^/]+)$~';

请参阅regex demo

[^\/]是一个否定的字符类,匹配除/之外的任何字符。

^$通常足以确保您的输入以当前模式开始和结束(您可以分别用\A\z替换它们确保\z匹配字符串的最后,或使用^ / $/D修饰符。)

即使您使用延迟.+?点匹配,如果需要返回有效匹配,.也会溢出多个/分隔符。

答案 1 :(得分:1)

首先......使用&#39; /&#39;以外的其他内容作为你的分隔符(斜杠作为正则表达式的开头和结尾)...它使得编写正则表达式更容易,而不必转义

中的分隔符
$regex = '#^/[a-z]+/[^/]+/[a-z]+/[a-z]+$#'