替换'&';带有';和';在PHP中运行


Replace '&' with 'and' on the fly in PHP

有没有一种方法可以在用户键入字符&时而不是在提交表单后将其替换为and

&插入我们的数据库时,我们的搜索引擎无法正确解释&,将其替换为返回错误搜索结果的&(即不包括&的结果)。

这是我们想要运行的字段:

<input type="text" name="project_title" id="project_title" value="<?php echo $project_title; ?>" size="60" class="btn_input2"/>

有没有办法替换字符&在PHP web表单中,当用户键入它时,而不是在提交表单后?

PHP在服务器上,它无法控制在任何情况下发生的任何事情,就像在客户端上一样。它从网络服务器发送原始文本,1亿吨热核设备爆炸,内容发送后PHP就再也不存在了。只剩下客户端收到的文件。要在客户端处理效果,您需要使用JavaScript。

要做到这一点,您可以选择您最喜欢的JavaScript库,并为"keyup"事件添加一个事件侦听器。将"与"替换为"answers",然后将替换文本放回框中。mugur发布了一个答案,告诉你如何做到这一点。

这在实践中是一个可怕的解决方案,因为你的用户会尖叫着要求血腥的正义,让他们摆脱如此糟糕的用户体验。你最终所做的是用他们不想要的东西替换输入文本。其他搜索工具都能做到这一点,为什么你的不能呢?你打了退格,然后呢?当你点击文本时,你可能会失去光标的位置。

不仅如此,你在治疗一种症状,而不是病因。看看你为什么这么做:

原因是当&被插入到我们的数据库中,我们的搜索引擎会弹出并用&然后返回不正确的结果(即不是包括&

不,你的数据库和搜索引擎不会做"翻出来"这样的事情。你不知道发生了什么,而是试图治疗症状,而不是了解原因并解决问题。你的症状治疗将在未来产生更多问题。不要这么做。

&amp;是一个HTML实体代码。每个"特殊"的角色都有一个。这意味着您的数据库还将>编码为&gt;,以及其中带有重音的字符(如法语、德语或西班牙语文本)。所有这些结果都是"错误的"。

你没有显示任何代码,所以你没有得到任何代码。但这就是你的问题所在。

您的代码正在将原始文本转换为HTML实体代码,在适当的情况下,您正在搜索未编码的字符串。

选项1:修复原因

用HTML实体对搜索文本进行编码,使其与所有这些情况相匹配。将重音charecters与他们的非重音表亲进行匹配,因此搜索"français"可能会返回"fran"。

选项2:修复一个症状

在客户端或服务器端对"与"符号进行字符串替换,您的搜索将中断对所有其他编码的搜索。永远找不到诸如"Bob>Sally"之类的文本。永远不要找到"法语"。

在提交表单之前,您需要使用JavaScript根据用户键入的内容进行更改。这并不理想,因为JS可以关闭。

您最好在提交之后但在插入数据库之前"清除"与号。

一个简单的str_replace应该有效:

str_replace(' & ',' and ', $_POST['value']);

但正如其他人指出的那样,这不是一个好的解决方案。最好的解决方案是在"与"符号进入数据库时对其进行编码(这似乎刚刚发生),然后修改搜索脚本以允许这样做。

当他们用jquery完成表单时,可以这样做:

$('#input').change(function() { // edited conforming Icognito suggestion
  var some_val =  $('#input').val().replace('&', 'and');
   $('#input').val( some_val );
});

编辑:工作示例(http://jsfiddle.net/4gXZW/13/)

JS:

$('.target').change(function() {
    $('.target').val($('.target').val().replace('&', 'and'));
});

HTML:

<input class="target" type="text" value="Field 1" />

否则,您可以在insertsql之前在PHP中执行此操作。

$to_insert = str_replace("&", "and", $_POST['your_variable']);