我有一个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 +位) - 将不胜感激。
答案 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