我有这个正则表达式:
`^(?:/(?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 possible duplicate的问题是我有不同的参数可选,而preg_match没有相应地匹配它们。上面的问题是不同的,因为问题是因为/?我的弹头断成两半了。
发布于 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
可读的正则表达式
^ /
(?:
(?<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放在末尾。
https://stackoverflow.com/questions/51903312
复制相似问题