我有这个正则表达式:
`^(?:/(?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没有相应地匹配它们。上面的问题是不同的,因为问题是因为/?我将弹头一分为二。
答案 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 保留在末尾。