PHP preg_replace 非字母数字导致数据库插入失败
PHP preg_replace non-alphanumeric results in DB insert failure
我在以下元标记上使用以下代码,导致 MySQL
中的字符串值不正确
PHPpreg_replace代码
$content = $link->getAttribute('content');
$content = preg_replace('/[^a-zA-Z\d\s\.]/', '', $content);
$content
的内容
FGC ferrocarrils de la generalitat de catalunya tren ferrocarril funicular cremallera aeri telefric teleferic bitllets fgc bitllets integrats bitllets turstics bitllets turistics turisme i muntanya tarifes horaris abonaments pl�nol xarxa planol xarxa lnia barcelonavalls linia barcelonavalles lnia LlobregatAnoia linia LlobregatAnoia Metro del Valls Metro del Valles Metro del Baix Llobregat lnies urbanes bcn linies urbanes bcn lnies suburbanes bcn linies suburbanes bcn barcelonasabadell barcelonaterrassa barcelonaigualada barcelonamanresa barcelonamartorell montserrat nria nuria vall de nria vall de nuria la Molina lleidala pobla gelida olesaesparraguera tren del ciment tren de lensenyament tren de vapor estacions accessibles l6 l7 s1 s2 s5 s55 l8 s33 s4 s8 r5 r6 transporttransport escolar projectes educatius tren de lensenyament programes pedaggics activitats educatives activitats pedaggiques histria fgc trens vapor cremallera funicular locomotora vagons estacions transports mobilitat pblic Rub Martorell Montserrat Vallvidrera Catalunya Turisme Via neu esqu snowboard esports dhivern bicicleta Mountain Bike accessibilitat Transport sostenible PMR Mobilitat reduda
元标记
<meta name="keywords" content="FGC, ferrocarrils de la generalitat de catalunya, tren, ferrocarril, funicular, cremallera, aeri, telefèric, teleferic, bitllets fgc, bitllets integrats, bitllets turístics, bitllets turistics, turisme i muntanya, tarifes, horaris, abonaments, plànol xarxa, planol xarxa, línia barcelona-vallès, linia barcelona-valles, línia Llobregat-Anoia, linia Llobregat-Anoia, Metro del Vallès, Metro del Valles, Metro del Baix Llobregat, línies urbanes bcn, linies urbanes bcn, línies suburbanes bcn, linies suburbanes bcn, barcelona-sabadell, barcelona-terrassa, barcelona-igualada, barcelona-manresa, barcelona-martorell, montserrat, núria, nuria, vall de núria, vall de nuria, la Molina, lleida-la pobla, gelida, olesa-esparraguera, tren del ciment, tren de l'ensenyament, tren de vapor, estacions accessibles, l6, l7, s1, s2, s5, s55, l8, s33, s4, s8, r5, r6, transport,transport escolar, projectes educatius, tren de l'ensenyament, programes pedagògics, activitats educatives, activitats pedagògiques, història fgc, trens, vapor, cremallera, funicular, locomotora, vagons, estacions, transports, mobilitat, públic, Rubí, Martorell, Montserrat, Vallvidrera, Catalunya, Turisme, Via, neu, esquí, snowboard, esports d'hivern, bicicleta, Mountain Bike, accessibilitat, Transport sostenible, PMR, Mobilitat reduïda"/>
MySQL错误
General error: 1366 Incorrect string value: '\xA0nol x...' for column 'meta_content' at row 1
我正在使用 CakePHP 3.4 插入数据,使用以下行...
$metaEntity = $metaTable->newEntity([
'domains_host_id' => $hostId,
'meta_name' => '',
'meta_property' => $property,
'meta_content' => $content,
]);
$metaTable->save($metaEntity);
这是我的数据库详细信息...
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| domains_software_metas | InnoDB | 10 | Dynamic | 2677 | 116 | 311296 | 0 | 0 | 2097152 | 2678 | 2017-10-15 10:49:07 | 2017-10-15 11:26:32 | NULL | utf8_general_ci | NULL | | |
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
关于如何让 preg_replace 替换那个讨厌的角色有什么想法吗?
您的问题肯定出在您的内容字符串的这一部分plànol xarxa
为什么 mySql 没有正确处理这个问题,我不确定。 PHP 的 DOM* 类 期望使用 UTF8 编码,根据错误消息中的 '\xA0nol x...'
文本,您可能没有这种编码。
加载 HTML 时,先尝试 utf8_decode()
。这会将 ISO-8859-1 转换为 UTF-8。
$document = new DOMDocument();
$html = getHtml(); // load your html code
$document->loadHTML(utf8_decode($html));
$link = findLink($document); // your code to find the link
$content = $link->getAttribute('content');
$content = preg_replace('/[^a-zA-Z\d\s\.]/', '', $content);
我建议您将 table 转换为 UTF8,这样您就可以支持所有字符。
虽然要回答这个问题,但根据 $content
、pl�nol
的输出,preg_replace
似乎正在将字符串处理为单字节字符。要使其作为 unicode 进行处理,请添加 u
修饰符。
$content = preg_replace('/[^a-zA-Z\d\s\.]/u', '', $content);
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
我在以下元标记上使用以下代码,导致 MySQL
中的字符串值不正确PHPpreg_replace代码
$content = $link->getAttribute('content');
$content = preg_replace('/[^a-zA-Z\d\s\.]/', '', $content);
$content
的内容 FGC ferrocarrils de la generalitat de catalunya tren ferrocarril funicular cremallera aeri telefric teleferic bitllets fgc bitllets integrats bitllets turstics bitllets turistics turisme i muntanya tarifes horaris abonaments pl�nol xarxa planol xarxa lnia barcelonavalls linia barcelonavalles lnia LlobregatAnoia linia LlobregatAnoia Metro del Valls Metro del Valles Metro del Baix Llobregat lnies urbanes bcn linies urbanes bcn lnies suburbanes bcn linies suburbanes bcn barcelonasabadell barcelonaterrassa barcelonaigualada barcelonamanresa barcelonamartorell montserrat nria nuria vall de nria vall de nuria la Molina lleidala pobla gelida olesaesparraguera tren del ciment tren de lensenyament tren de vapor estacions accessibles l6 l7 s1 s2 s5 s55 l8 s33 s4 s8 r5 r6 transporttransport escolar projectes educatius tren de lensenyament programes pedaggics activitats educatives activitats pedaggiques histria fgc trens vapor cremallera funicular locomotora vagons estacions transports mobilitat pblic Rub Martorell Montserrat Vallvidrera Catalunya Turisme Via neu esqu snowboard esports dhivern bicicleta Mountain Bike accessibilitat Transport sostenible PMR Mobilitat reduda
元标记
<meta name="keywords" content="FGC, ferrocarrils de la generalitat de catalunya, tren, ferrocarril, funicular, cremallera, aeri, telefèric, teleferic, bitllets fgc, bitllets integrats, bitllets turístics, bitllets turistics, turisme i muntanya, tarifes, horaris, abonaments, plànol xarxa, planol xarxa, línia barcelona-vallès, linia barcelona-valles, línia Llobregat-Anoia, linia Llobregat-Anoia, Metro del Vallès, Metro del Valles, Metro del Baix Llobregat, línies urbanes bcn, linies urbanes bcn, línies suburbanes bcn, linies suburbanes bcn, barcelona-sabadell, barcelona-terrassa, barcelona-igualada, barcelona-manresa, barcelona-martorell, montserrat, núria, nuria, vall de núria, vall de nuria, la Molina, lleida-la pobla, gelida, olesa-esparraguera, tren del ciment, tren de l'ensenyament, tren de vapor, estacions accessibles, l6, l7, s1, s2, s5, s55, l8, s33, s4, s8, r5, r6, transport,transport escolar, projectes educatius, tren de l'ensenyament, programes pedagògics, activitats educatives, activitats pedagògiques, història fgc, trens, vapor, cremallera, funicular, locomotora, vagons, estacions, transports, mobilitat, públic, Rubí, Martorell, Montserrat, Vallvidrera, Catalunya, Turisme, Via, neu, esquí, snowboard, esports d'hivern, bicicleta, Mountain Bike, accessibilitat, Transport sostenible, PMR, Mobilitat reduïda"/>
MySQL错误
General error: 1366 Incorrect string value: '\xA0nol x...' for column 'meta_content' at row 1
我正在使用 CakePHP 3.4 插入数据,使用以下行...
$metaEntity = $metaTable->newEntity([
'domains_host_id' => $hostId,
'meta_name' => '',
'meta_property' => $property,
'meta_content' => $content,
]);
$metaTable->save($metaEntity);
这是我的数据库详细信息...
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| domains_software_metas | InnoDB | 10 | Dynamic | 2677 | 116 | 311296 | 0 | 0 | 2097152 | 2678 | 2017-10-15 10:49:07 | 2017-10-15 11:26:32 | NULL | utf8_general_ci | NULL | | |
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
关于如何让 preg_replace 替换那个讨厌的角色有什么想法吗?
您的问题肯定出在您的内容字符串的这一部分plànol xarxa
为什么 mySql 没有正确处理这个问题,我不确定。 PHP 的 DOM* 类 期望使用 UTF8 编码,根据错误消息中的 '\xA0nol x...'
文本,您可能没有这种编码。
加载 HTML 时,先尝试 utf8_decode()
。这会将 ISO-8859-1 转换为 UTF-8。
$document = new DOMDocument();
$html = getHtml(); // load your html code
$document->loadHTML(utf8_decode($html));
$link = findLink($document); // your code to find the link
$content = $link->getAttribute('content');
$content = preg_replace('/[^a-zA-Z\d\s\.]/', '', $content);
我建议您将 table 转换为 UTF8,这样您就可以支持所有字符。
虽然要回答这个问题,但根据 $content
、pl�nol
的输出,preg_replace
似乎正在将字符串处理为单字节字符。要使其作为 unicode 进行处理,请添加 u
修饰符。
$content = preg_replace('/[^a-zA-Z\d\s\.]/u', '', $content);
http://php.net/manual/en/reference.pcre.pattern.modifiers.php