2

我正在处理这个每日数据馈送。令我惊讶的是,其中一个字段在 MySQL 中看起来并不正确。(我无法控制谁提供提要。)

所以我做了一个 mysqldump 并发现该记录的邮政编码和城市包含一个非打印字符。它在“vi”中显示为:<200e>

我正在使用 PHP,我解析这些数据并将其放入 MySQL 数据库。我已经使用了修剪功能,但这并没有摆脱它。问题是,如果您对 MySQL 数据库中的邮政编码进行查询,它不会找到具有非打印字符的记录。

我希望在将其放入 MySQL 数据库之前对其进行清理。

我可以在 PHP 中做什么?起初我认为正则表达式只允许 az、AZ 和 0-9,但这对地址不利。地址使用句点、逗号、连字符,也许还有其他我目前没有想到的东西。

最好的方法是什么?除了只允许打印字符之外,我不知道它被称为什么来定义它。是否有另一个像 trim 这样的 PHP 函数可以完成这项工作?还是正则表达式?如果是这样,我想要一个例子。谢谢!

我已经研究过使用 PHP 函数,并在 PHP.NET 上看到了这个:

<?php
$a = "\tcafé\n";
//This will remove the tab and the line break
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
//This will remove the é.
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
?>

虽然使用 FILTER_FLAG_STRIP_HIGH 确实去除了我在“vi”中提到的 <200e>,但我担心它会去除 André 等名称中的字母重音。

也许正则表达式是解决方案?

4

4 回答 4

4

您可以使用 PHP 过滤器:http ://www.php.net/manual/en/function.filter-var.php

我建议使用FILTER_SANITIZE_STRING过滤器或任何适合您需要的东西。

于 2012-11-08T19:31:46.603 回答
2

我认为您可以使用这个小正则表达式替换:

preg_replace( '/[^[:print:]]+/', '', $your_value);

它基本上从 $your_value 中删除了所有非打印字符

于 2012-11-08T19:32:11.813 回答
1

我试过这个:

<?php
$string = "\tabcde éç ÉäÄéöÖüÜß.,!-\n";
$string = preg_replace('/[^a-z0-9\!\.\, \-éâëïüÿçêîôûéäöüß]/iu', '', $string);
print "[$string]";

它给出了:

[abcde éç ÉäÄéöÖüÜß.,!-]

将您需要的所有特殊字符添加到正则表达式中。

于 2012-11-08T22:10:33.817 回答
0

如果你用英语工作并且不需要支持 unicode 字符,那么只允许[\x20-\x7E]

...并删除所有其他人:

$s = preg_replace('/[^\x20-\x7E]+/', '', $s);
于 2012-11-08T19:28:15.540 回答