替换'&'用'和'在PHP中动态

时间:2012-02-01 13:51:36

标签: php forms replace preg-replace str-replace

有没有办法在用户输入PHP网页表单时将&替换为and,而不是在提交表单后?

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

以下是我们要在此处运行的字段:

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

3 个答案:

答案 0 :(得分:4)

  

有没有办法取代角色&amp;使用和在PHP Web表单中,当用户键入它而不是在提交表单后?

PHP在服务器上,它无法控制在客户端的任何情况下发生的任何事情。它从Web服务器发送原始文本,100megaton热核设备爆炸,并且在内容发送后PHP不再存在。只是您客户端收到的文件仍然存在。要在客户端使用效果,您需要使用JavaScript。

为此,您可以选择自己喜欢的JavaScript库并为“keyup”事件添加事件监听器。用“和”替换&符号,然后将替换文本放回框中。 mugur发布了一个答案,告诉你如何做到这一点。

这在实践中是一个可怕的解决方案,因为您的用户会因为血腥的正义而尖叫,以便从如此糟糕的用户体验中提供这些解决方案。你最终做的是用他们不想要的东西替换输入文本。其他搜索工具这样做,为什么不能用你的?你击退退格,然后是什么?当您点击文本时,可能会丢失光标位置。

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

  

原因是&amp;插入我们的数据库,我们的搜索引擎翻转并替换为&amp;然后返回不正确的结果(即不包括&amp;的结果)。

不,你的数据库和搜索引擎没有“翻转”这样的东西。你不知道发生了什么,试着治疗症状而不是了解原因并加以解决。您的症状治愈将在未来产生 MORE 问题。不要这样做。

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

您没有显示任何代码,因此您没有获得任何代码。但这就是你的问题所在。

您的代码正在将原始文本转换为HTML实体代码(如果适用),您将搜索非编码字符串。

选项1:修复原因

使用HTML实体对搜索文本进行编码,使其与所有这些情况相匹配。将重音字符与非重音表兄弟匹配,以便搜索“francais”可能会返回“français”。

选项2:修复一个症状

在客户端或服务器端执行字符串替换&符号,对所有其他编码执行搜索中断。永远不要找到诸如“Bob&gt; Sally”之类的文本。永远不要找“français”。

答案 1 :(得分:2)

你可以这样做,因为他们用这样的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" />

否则你可以在insert sql之前在PHP中执行此操作。

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

答案 2 :(得分:2)

在提交表单之前,您需要使用JavaScript在用户输入时进行更改。由于JS可以关闭,因此不太理想。

在提交之后但在插入数据库之前,你会更好地“清理”&符号。

一个简单的str_replace应该可以工作:

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

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