首页 > 解决方案 > php preg_match 可选斜杠无法正常工作

问题描述

我有这个正则表达式:

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

哪个应该使用

/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

问题是只有第四个才有效。

Array
(
    [cat1] => cat-one
    [cat2] => cat-two
    [cat3] => cat-three
    [cat4] => cat-four
    [slug] => product
    [id] => 14
)

'slug' 参数的前三个只有一个字母,而之前的 cat 获取第一个字母:

Array
(
    [cat1] => cat-one
    [cat2] => cat-two
    [cat3] => produc
    [cat4] => 
    [slug] => t
    [id] => 14
)

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

(?P<cat1>[^/\.]+/?)?)

我怎样才能使 / 可选但仍然得到我需要的结果?

谢谢!

LE:这里preg match 可能重复的问题是我有不同的参数可选,而 preg_match 没有相应地匹配它们。上面的问题是不同的,因为问题是因为 /? 我的蛞蝓断成两半。

标签: phpregex

解决方案


不要将其/设为可选,因为这些组是可选的。
这使 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

可读的正则表达式

 ^ /
 (?:
      (?<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之前可能有更多嵌套,只需在名为组 的slug之前添加。
(?:[^/.\r\r]+/)*

这将始终将slug-id保留在最后。


推荐阅读