正则表达式 slug 在另一个词之前

Posted

技术标签:

【中文标题】正则表达式 slug 在另一个词之前【英文标题】:Regular expression slug before another word 【发布时间】:2018-11-01 03:59:37 【问题描述】:

我正在制作一个作家的网站,我想展示一些书籍,然后是一些摘录。

我希望 URL 看起来像这样: site.com/book/书名 site.com/book/name-of-book/excerpt

我设法用这个 htacess 完成了第一部分:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %SCRIPT_FILENAME !-d
RewriteCond %SCRIPT_FILENAME !-f

# Remove .php from regular pages
RewriteRule ^([^\.]+)$ $1.php [NC,L]

# Directory style books
RewriteRule ^book/(.*)$ ./book.php?slug=$1

# Directory style books excerpts
RewriteRule ^book/(.*)/excerpt$ ./book-excerpt.php?slug=$1

我的问题是第二部分,因为它不起作用,加载了 book.php,而不是 book-excerpt.php

我一直在研究如何做到这一点,但整个网络上的所有解决方案似乎都不适合我。我究竟做错了什么? 第一条规则是否凌驾于第二条之上?我该如何解决这个问题?

【问题讨论】:

而“它不工作”意味着什么?你有错误吗?哪一个?客户端挂了?多久?你收到一个虚假的答案吗?哪一个?宇宙会内爆吗?我们无法猜测,您需要告诉我们。 问题很可能是处理顺序:因为最后一个规则 always 匹配,所以不可能应用最后一个规则。改变他们的顺序! @arkascha 添加了一些细节。正如你所说,我尝试改变顺序,但结果是一样的。 @arkascha 第一条规则遵循与最后一条相同的理想。通过将所有规则 1-2-3 交换为 3-2-1,我可以使它起作用。 【参考方案1】:

由于规则相互覆盖,因此将所有规则(1-2-3 到 3-2-1)交换即可。

Options +FollowSymLinks
RewriteEngine On

RewriteCond %SCRIPT_FILENAME !-d
RewriteCond %SCRIPT_FILENAME !-f

# Directory style books excerpts
RewriteRule ^book/(.*)/excerpt$ ./book-excerpt.php?slug=$1

# Directory style books
RewriteRule ^book/(.*)$ ./book.php?slug=$1

# Remove .php from regular pages
RewriteRule ^([^\.]+)$ $1.php [NC,L]

【讨论】:

以上是关于正则表达式 slug 在另一个词之前的主要内容,如果未能解决你的问题,请参考以下文章

urlpattern 的正则表达式

路由中uri slug的codeigniter正则表达式

Coldfusion 正则表达式生成 slug

PHP 正则表达式匹配Slug

Rails4:模型验证 slug 列的“格式”正则表达式

如果前面没有否定词,则正则表达式包含词[重复]