在php中将每个单引号替换为'

4

我在问题表单中有一个以下的textarea字段,用户可以在其中发布他们的问题:

<tr>
    <th><label><?php echo $this->lang->line('question'); ?>: </label></th>
    <td><textarea  value="" id="ques_desc" name="ques_desc"
        class="validate[required] text-input" > </textarea> </td>
</tr>

问题在于用户从Word或Excel复制粘贴问题时,符号'会变成并以相同格式存储在数据库中。

示例:

Check men's and women's rest rooms

变成

Check men’s and women’s rest rooms

当用户在搜索框中搜索“检查男性”时,搜索结果中没有出现“检查男性”。

我尝试了使用 str_replace 函数处理 ',但它并没有起作用。 例如:

$ques_desc = str_replace("’","'",$ques_desc);

不替换'

如何用'替换每个

编辑:

当我在查看页面上执行此操作时:

<?php 
$ques_desc1 = "Check men’s and women’s rest rooms "; 
$ques_desc = str_replace("’","'",$ques_desc1); 
echo $ques_desc; 
?>

它显示:

Check men's and women's rest rooms

它成功了!

当我在控制器上执行此操作时:

$ques_desc1 = $this->input->post('ques_desc');
$ques_desc = str_replace(" ",".",$ques_desc1);

它显示:

将“Take O’pening Stock Count”更改为“Take.O’pening.Stock.Count”

它也起作用了!

但是当我这样做时:

$ques_desc1 = $this->input->post('ques_desc');
$ques_desc = str_replace("’","'",$ques_desc1);

它不起作用,什么也没有改变。


1
难道修复您的搜索引擎不是更好的解决方案吗?例如,如果您的数据库需要存储单词“café”,而人们想要使用“cafe”进行搜索,那么也许您可以将“é”更改为“e”,但这样会破坏非英语文本。 - icktoofay
1
我期望它是一个看起来像引号的Unicode字符。你需要知道它实际上是哪个字符。如果你能发布数据的十六进制转储,那就太好了。我曾经为PHP编写过一个hexdump包。也许你可以试试它。 - hek2mgl
4个回答

3

像这样使用str_replace

echo str_replace("’","'","Check men’s and women’s rest rooms");

输出

Check men's and women's rest rooms

代码编辑器

(相关it技术内容)

2
只要没有Unicode中0x27是多字节字符的一部分,就可以。 - alex
正如我之前所说,我在将内容发布到数据库之前尝试了str_replace,但它根本不起作用。 $ques_desc = str_replace("'","’",$ques_desc); 无法将’替换为'。 - Vijaya Pandey
2
@alex:只要是UTF-8编码,这种情况就不会发生。没有高位清零的字节会成为多字节序列的一部分。 - icktoofay
@icktoofay 我只是在尝试制作一个示例时才发现这一点。 :) - alex
1
@Venonj - 请在您的问题中包含一个可工作/不可工作的示例(编辑它)。这样更容易阅读。 - bestprogrammerintheworld
显示剩余2条评论

3
我发现了自己问题的解决方法。
我尝试了以下方法:
$ques_desc1 = $this->input->post('ques_desc');
$ques_desc = iconv('UTF-8', 'ASCII//TRANSLIT', $ques_desc1);

在这里,iconv('UTF-8', 'ASCII//TRANSLIT', $ques_desc1)将Microsoft Word版本的单引号和双引号标记“ ” ‘ ’替换为常规引号'"。它完美地完成了任务。

1
+1 是为了找到你自己的解决方案,同时我也可以得到解决方案作为参考... :P - Yogesh Suthar

0

你在 str_replace 语法中犯了错误。你应该把 放在第一个参数,把 ' 放在第二个参数。所以请修改为:

$ques_desc = str_replace("'","’",$ques_desc);

至:

$ques_desc = str_replace("’","'",$ques_desc);

我找到了解决方案。请检查我的答案。 - Vijaya Pandey

0

看起来你在使用 Microsoft Word 的智能引号时遇到了一些问题。请查看这个答案,里面有一些处理方法的小技巧。

我进行了一个简单而快速的测试,这种特定的方法是有效的:

$quotes = array(
    "\xC2\xAB"     => '"', // « (U+00AB) in UTF-8
    "\xC2\xBB"     => '"', // » (U+00BB) in UTF-8
    "\xE2\x80\x98" => "'", // ‘ (U+2018) in UTF-8
    "\xE2\x80\x99" => "'", // ’ (U+2019) in UTF-8
    "\xE2\x80\x9A" => "'", // ‚ (U+201A) in UTF-8
    "\xE2\x80\x9B" => "'", // ‛ (U+201B) in UTF-8
    "\xE2\x80\x9C" => '"', // “ (U+201C) in UTF-8
    "\xE2\x80\x9D" => '"', // ” (U+201D) in UTF-8
    "\xE2\x80\x9E" => '"', // „ (U+201E) in UTF-8
    "\xE2\x80\x9F" => '"', // ‟ (U+201F) in UTF-8
    "\xE2\x80\xB9" => "'", // ‹ (U+2039) in UTF-8
    "\xE2\x80\xBA" => "'", // › (U+203A) in UTF-8
);
$str = strtr($str, $quotes);

我必须同意评论中icktoofay的观点,除此之外,重新调整搜索引擎以便更宽松匹配也是一个好主意。 - Jonathan
我找到了解决方案。请检查一下我的回答。 - Vijaya Pandey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接