MySQL / PHP preg_replace和KEEP重音和空格

时间:2011-08-03 17:15:49

标签: php mysql preg-replace diacritics

我有一个MySQL数据库,从PHP驱动的表单提供数据。表列整理为utf8_bin,连接字符集设置为utf8,HTML也是如此。

经过广泛的谷歌搜索后,我似乎无法找到任何明确的方法来使用preg_replace来删除不需要的字符(和数字),但保留大写/小写的重音符号,变音符号和空格。我拼凑了似乎有用的东西 - 但我根本不懂,所以不知道它有多安全。因此,使用转义条款加倍:

$lname = preg_replace("/(<\/?)(\w+)([^>]*>)/e","", $lname);
        $lname = mysql_real_escape_string($lname);

我真正需要的是那种可以采用以下名称的条款(我的,作为一个例子):“ÉamonnMacLochlainn”然后存储它,而不是“c389616d6f6e6eMacLochlainn”我也查看了strip_tags,允许“ÁÉÍÓÚáéíóú”。这是前进的方向吗?

任何帮助 - 特别是对此代码段中发生的事情的解释(\ w +位) - 将不胜感激。

2 个答案:

答案 0 :(得分:7)

\w是根据当前区域设置的单词字符。如果为所有数据正确设置:没问题。如果你的语言环境不够,你可以说所有的字母&amp;空格是有效的:

$lname = preg_replace('/[^\s\p{L}]/u','',$lname);

有关\w的详细信息,请参阅Escape sequences
有关unicode属性的更多信息(\p/u切换相结合),请参阅Unicode Properties

你似乎做了更多,然后只是验证字符,也剥离HTML标签。 strip_tags确实适用于此(在替换之前执行此操作)。

答案 1 :(得分:4)

如果您只想保留法语或英语的大写和小写字母字符,此解决方案可能适合您:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<?php
$str="Conférence ministérielle sur la francophonie canadienne - Éamonn Mac Lochlainn";
echo preg_replace("/[^a-zA-ZÀ-ÿ  ]/",'',$str);
?>
</body>
</html>

echo的回应是:

Conférence ministérielle sur la francophonie canadienne Éamonn Mac Lochlainn