首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Php preg_match可选斜杠不能正常工作

Php preg_match可选斜杠不能正常工作
EN

Stack Overflow用户
提问于 2018-08-18 05:54:08
回答 1查看 232关注 0票数 1

我有这个正则表达式:

代码语言:javascript
复制
`^(?:/(?P<cat1>[^/\.]+/?)?)(?:(?P<cat2>[^/\.]+/?)?)(?:(?P<cat3>[^/\.]+/?)?)(?:(?P<cat4>[^/\.]+/?)?)(?:(?P<slug>[^/\.]+))-(?:(?P<id>[0-9]++))$`u

它应该可以与

代码语言:javascript
复制
/cat-one/product-14
/cat-one/cat-two/product-14
/cat-one/cat-two/cat-three/product-14
/cat-one/cat-two/cat-three/cat-four/product-14

问题是,只有使用第四个才能正常工作。

代码语言:javascript
复制
Array
(
    [cat1] => cat-one
    [cat2] => cat-two
    [cat3] => cat-three
    [cat4] => cat-four
    [slug] => product
    [id] => 14
)

前三个'slug‘参数只有一个字母,前面的cat得到了第一个字母:

代码语言:javascript
复制
Array
(
    [cat1] => cat-one
    [cat2] => cat-two
    [cat3] => produc
    [cat4] => 
    [slug] => t
    [id] => 14
)

我知道可选的/会导致一些问题,但我需要它来匹配代码中的其他内容,并且这个正则表达式是以动态方式生成的,我不能仅为这种情况设置特定的if。

代码语言:javascript
复制
(?P<cat1>[^/\.]+/?)?)

如何使/可选,同时仍能得到所需的结果?

谢谢!

LE:preg match possible duplicate的问题是我有不同的参数可选,而preg_match没有相应地匹配它们。上面的问题是不同的,因为问题是因为/?我的弹头断成两半了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-18 06:57:41

不要将/设置为可选,因为组是可选的。

这使得slug-id每次都保持不变。

^/(?:(?<cat1>[^/.\r\n]+/)?)(?:(?<cat2>[^/.\r\n]+/)?)(?:(?<cat3>[^/.\r\n]+/)?)(?:(?<cat4>[^/.\r\n]+/)?)(?:(?<slug>[^/.\r\n]+))-(?:(?<id>[0-9]++))$

https://regex101.com/r/Z64x8l/1

可读的正则表达式

代码语言:javascript
复制
 ^ /
 (?:
      (?<cat1> [^/.\r\n]+ / )?      # (1)
 )
 (?:
      (?<cat2> [^/.\r\n]+ / )?      # (2)
 )
 (?:
      (?<cat3> [^/.\r\n]+ / )?      # (3)
 )
 (?:
      (?<cat4> [^/.\r\n]+ / )?      # (4)
 )
 (?:
      (?<slug> [^/.\r\n]+ )         # (5)
 )
 -
 (?:
      (?<id> [0-9]++ )              # (6)
 )
 $

注意,添加\r\n是为了多行目的。如果你只有一行

字符串,把它拿出来。

此外,如果您认为在slug-id之前可能有更多的嵌套,

不需要考虑,只需在名为group的插件前添加(?:[^/.\r\r]+/)*即可。

这将始终将slug-id放在末尾。

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

https://stackoverflow.com/questions/51903312

复制
相关文章

相似问题

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