我正在寻找解决列出书名的"漂亮链接"或"永久链接"的问题,例如:

http://www.example.com/title/The-Catcher-in-the-Rye/

当我处理具有简单单词或空格的常规书名时,没有问题,因为我可以简单地用破折号-替换空格,并通过做反向。

但是,当我的书名中带有撇号'或冒号:或两者均是本示例时,就会出现问题:

Why Can't I Be You: A Novel

在我的sql数据库中,所有单引号均被转义,因此数据库中的条目如下:

+-----+-------------------------------+

| BID | book_title                    |

+-----+-------------------------------+

|   1 | Why Can\'t I Be You: A Novel  |

+-----+-------------------------------+

当我列出所有书名时,我再次取消转义该字符串,因此它简单地列出为:Why Can't I Be You: A Novel

我的链接显示了未转义的标题,这些漂亮的链接是通过用短划线代替空格并省略撇号和冒号而创建的,如下所示:

Why Can't I Be You: A Novel

所以,解决我的问题。我希望能够列出格式(未转义)的所有书名,并使用带连字符的"永久链接" /"漂亮链接",并将正确的标题返回给GET方法。

在我的.htaccess条目中,有以下RewriteRule:

RewriteRule ^title/(.*[^/])/?$ viewbook.php?booktitle=$1 [NC,L]

这样做是采用title/之后的"漂亮"链接部分,并通过GET将其发送到viewbook.php。因此,例如对于《麦田守望者》一书,以下内容通过GET发送:The-Catcher-in-the-Rye

那里没有问题,因为在php中解决此问题很简单:

$booktitle = $_GET['booktitle'];

$goodBookTitle = str_replace('-', ' ', $booktitle);

// or we can do it all at once

$booktitle = str_replace('-', ' ', $_GET['booktitle']);

// Send $booktitle to SQL query and find the book

当找不到撇号时,此方法效果很好,但是,如果标题中带有撇号或冒号,则此方法无济于事,因为在数据库中找不到该标题。我也不想使用WHERE book_title LIKE '%$booktitle%',因为viewbook.php必须完全匹配。

我正在寻找一种优雅或简单的解决方案,该解决方案使我能够通过RewriteRule解决此问题,而不必在数据库中添加诸如slug或permalink的额外表,并且我不想使用撇号在网址中,例如%27为单引号。这是一个大型数据库,可以在电子表格中完成数据输入,导出到CSV并上传到SQL数据库。没有单个条目的前端来允许诸如slug或等效项之类的事情。

希望我的解释清楚。

您的数据不应在标题中以反斜杠存储。 因此,在列出数据之前无需取消转义数据。

为什么我不能在SQL数据库中转义单引号?

在数据库中存储文本时使用转义数据,以便能够正确存储一些特殊字符(如单引号)。 用于转义特殊字符的反斜杠未写入数据库中,因此,当您要从数据库读取数据时,没有任何转义或不转义的内容。

您在存储的数据中看到反斜杠的事实表明您在某处对它进行了太多次转义。 SQL查询可能类似于INSERT ... Why Can\\\t I Be You ...。

首先,在数据库中存储转义字符串的想法看起来很奇怪。 MySQL能够存储任意字符的字符串,甚至可以安全地存储二进制序列。

现在介绍从真实标题到漂亮URL的映射。将标题转换为对URL友好的字符串然后返回的想法并不是解决您的问题的常用方法,因为很难实现这种转换。解决此问题的常用方法是在数据库中将包含书名的单独列修改为对URL友好。此外,此列中的值也应唯一。该表可能如下所示:

+-----+-----------------------------+----------------------------+

| BID | book_title                  | book_title_url             |

+-----+-----------------------------+----------------------------+

|   1 | Why Can't I Be You: A Novel | why-can-t-i-be-you-a-novel |

+-----+-----------------------------+----------------------------+

您应该按此列为表建立索引,并在viewbook.php脚本内的SQL查询中使用它代替book_title,如下所示:

SELECT * FROM books WHERE book_title_url='$booktitle'

其中$booktitle包含通过$_GET['booktitle']接收的书名,并正确转义以防止SQL注入。

因此,您漂亮的URL看起来像http://www.example.com/title/why-can-t-i-be-you-a-novel,它们将被Apache重写为http://www.example.com/viewbook.php?booktitle=why-can-t-i-be-you-a-novel之类的东西。

同样,这是通常实现漂亮URL的常用方法。希望它也对您有用。

对于现有记录,您可以通过以下方式填充book_title_url列:

UPDATE books SET book_title_url=REPLACE(REPLACE(REPLACE(book_title,"","-"),":","-"),"'","-");

我想避免这种情况,但是,考虑一下您的解决方案,再加上@shomeax可以为我做这件事。感谢您的输入和填充新book_title_url列的解决方案

根据STD 66,冒号和撇号在路径段中均有效:

segment    = *pchar

pchar      = unreserved / pct-encoded / sub-delims /":" /"@"

sub-delims ="!" /"$" /"&" /"'" /"(" /")"

/"*" /"+" /"," /";" /"="

因此,在这种情况下,您可以在未编码的URI中使用它们:

title="Why Can't I Be You: A Novel">Why Can't I Be You: A Novel

维基百科就是这样的:例如http://en.wikipedia.org/wiki/Breakin'_2:_Electric_Boogaloo(alas StackOverflow在创建超链接时对这些字符进行了编码)。

真正不能使用的字符必须以某种方式进行编码(标准化方法是使用百分比编码,但是如果由于某种原因您不可接受,则可以执行特定于应用程序的操作),或者省略(例如通过查找第二列,如@MikhailVladimirov的答案中所述)。

提交了有关StackOverflows URL解析的错误。

感谢您的参考阅读,但是,我承认我的决定更多地是基于"理想"的解决方案,而不是实际的解决方案,尽管它可以按照std66进行工作,但从美学上来讲并不是令人满意的(我知道,设计胜过功能,但是那我的OCD)。

@fizzydrink:很好,只要您记住美感是主观的即可("情人眼里是情人")。显然,维基百科采取了不同的观点,但这完全是您的选择。我的个人观点是尽可能使用完整标题,以便自动解析URL的工具(例如搜索引擎)将获得正确的标点符号。

不要忘了通过url进行索引,否则它将工作缓慢,除非您要进行SQL注入,否则请转义来自请求的变量:)

如果您可以选择将整数id嵌入到漂亮的url中,则可以解决所有这些问题,例如:

http://www.whaaa.at/title/1/whatever-fancy-%34name%34-you-like

然后按该ID查找

无论如何,书名不是主键,因为可能会有几本书具有相同的标题。

我将很有可能将其与@Mikhails解决方案结合使用。我想避免这种情况,但实际上并没有" Perfect Pretty Permalinks"之类的东西,我想这更多是" OCD"问题,而不是设计决定。

php 号和冒号,关于php:漂亮链接中的撇号和冒号相关推荐

  1. c语言撇号的用法,不同的语言标点使用也不同,英语中的撇号如何使用?美联英语带你了解...

    学了这么多年英语,你真的会使用英语中的撇号吗?各种所有格和动词缩略语怎么写又是正确的呢? The possessive case 所有格 The possessive case is used to ...

  2. jq输出html 单引号引号转义符,javascript - 由于JSON中的单引号转义,jQuery.parseJSON抛出“无效的JSON”错误...

    根据JSON网站上的状态机图,只允许转义双引号字符,而不是单引号. 单引号字符不需要转义: 更新 - 有兴趣的人的更多信息: Douglas Crockford没有具体说明为什么JSON规范不允许字符 ...

  3. mysql 怎么加上撇号_php - 如何在写入Mysql数据库时处理撇号

    这个问题在这里已有答案: 如何在PHP中阻止SQL注入?                                     28个答案 我收到此错误: 您的SQL语法有错误; 检查与您的MySQ ...

  4. python中井号的作用_在python请求中处理井号(#)

    基本上,URL中的任何文本井号后的内容都是而不是发送到服务器.这适用于浏览器和requests.在 URL的格式表明type=#results部分实际上是一个查询参数.在 requests将自动编码查 ...

  5. oracle大于号怎么用,解决MyBatis的mapper中SQL小于号或大于号报错-tag name expected

    通常写SQL我们都会在Navicat里面写好条件测试没问题之后才会把SQL放到mapper里面,有次我在写Oracle的分页的时候因为用到了<=符号,在Navicat测试的时候是没问题的,但是放 ...

  6. c语言 号咋打,C语言C语言中的开头#号如何打? – 手机爱问

    2004-12-20 C语言中如何实现输入密码?(在输入时显示为*号.) 参考: 以下程序功能: 接受所有打印字符. 不接受控制字符,如Ctrl+ ,Alt,F1等. 可使用退格键删除以输入字符. 回 ...

  7. PHP中的单引号和双引号的区别

    PHP中单引号和双引号简介 PHP中字符串和变量插值时单引号和双引号的区别 PHP中转义撇号时单引号和双引号的区别 本文将介绍PHP中单引号和双引号的区别. PHP中单引号和双引号简介 在 PHP 中 ...

  8. html中单引号与双引号区别,JS 和 HTML 中的单引号与双引号

    JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 ' ' x 1 ...

  9. c语言中把每个字母向前移1位,C语言:将字符串中的前导*号全部移到字符串的尾部。...

    //规定输入的字符串中只包含字母和*号,fun函数:将字符串中的前导*号全部移到字符串的尾部. 1 #include 2 void fun( char *a ) 3 { 4 char b[81]; 5 ...

最新文章

  1. 《从零开始学Swift》学习笔记(Day 52)——Cocoa错误处理模式
  2. 关于2020年第十五届全国大学生智能汽车竞赛山东赛区技术答辩的相关规则
  3. c51单片机的语言,51单片机,stm32,arduino都是用什么语言进行编程的?
  4. Aurora — 一个在 MSOffice 内输入 LaTeX 公式的很好用插件
  5. 释疑のABAP输入框字符自动变成大写问题
  6. 2021的第一个offer来自mbzuai
  7. boost::spirit模块实现展示不同容器类型的输出格式化的统一和简单的方法
  8. Redis集群~StackExchange.redis连接Sentinel服务器并订阅相关事件
  9. mac下编译hadoop-3.0.3
  10. FISCO BCOS 区块链 零知识证明 可监管
  11. 栅栏密码(Fence)——python解密
  12. 高斯滤波详解 附python和matlab高斯滤波代码
  13. python pdfminer3k_python 使用pdfminer3k 读取PDF文档的例子
  14. 互盾科技:博观而约取,厚积而薄发
  15. 【SAP Abap】SE91 - SAP MESSAGE 消息类创建与应用
  16. 《计算机科学导论》第四章 数据运算
  17. Uniapp中使用Echarts
  18. 示例程序009--阙值化(二值化,cvThreshold)
  19. # 学号12 2016-2017-2 《程序设计与数据结构》第9周学习总结
  20. Unity - 计算两个向量之间的夹角

热门文章

  1. MT【311】三角递推数列
  2. 5G+AR出圈,中国移动咪咕成第33届中国电影金鸡奖全程战略合作伙伴
  3. VBE的各个窗口功能介绍
  4. 如何设计风格统一的图标
  5. python模拟生产者消费者进程可视化tkinter
  6. ps2021神经网络AI滤镜在哪,ps2021神经滤镜不能下载
  7. 在mysql中unique唯一索引的作用_MySQL_MySQL中的唯一索引的简单学习教程,mysql 唯一索引UNIQUE一般用于不 - phpStudy...
  8. WEBRTC 录音与会议录音【转】
  9. Attention 注意力机制浅学
  10. 淘宝获得商品销量详情API调用展示