我正在尝试使用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>[^/]+)$#';
答案 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]+$#'