PHP preg_match可选斜杠无法正常工作

时间:2018-08-17 21:54:08

标签: php regex

我有这个正则表达式:

`^(?:/(?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”参数的前三个字母只有一个字母,而前猫则得到第一个字母:

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

我知道可选的/会引起一些问题,但是我需要它与代码中的其他内容匹配,并且此正则表达式是动态生成的,并且仅在这种情况下我无法设置特定的值。

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

如何将/设为可选,但仍然获得所需的结果?

谢谢!

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

1 个答案:

答案 0 :(得分:1)

不要将/设为可选,因为这些组是可选的。
每次 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 保留在末尾。