php - 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 没有相应地匹配它们。上面的问题是不同的,因为问题是因为 /? 我的蛞蝓断成两半。
解决方案
不要将其/
设为可选,因为这些组是可选的。
这使 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保留在最后。
推荐阅读
- php - 无法将下拉选择的选项从 index.php 发送到控制器,然后发送到 codeigniter 中的 search.php
- typescript - 打字稿“新(...args:任何[])=> T”与“{新(...args:任何[]):T}”
- angular - ExpressionChangedAfterItHasBeenCheckedError - 共享服务
- c# - 可以使用 Pubnub 通知频道成员
- java - 从亚太地区(孟买)使用 aws ses sdk(Java) 发送电子邮件
- excel - 将宏插入到 Excel 文件中的 VB 脚本
- csv - 将带有 date.time 列的 csv 解析为 C#
- reactjs - 似乎无法从 npm run build 获取捆绑文件
- django - 如何使用 django 保护文件上传
- angular - 如何在角度 6 中单独检查每个查询参数