【问题标题】:PHP preg_replace non-alphanumeric results in DB insert failurePHP preg_replace 非字母数字导致数据库插入失败
【发布时间】:2017-10-15 15:30:26
【问题描述】:

我在以下元标记上使用以下代码,导致 MySQL 中的字符串值不正确

PHP preg_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 错误

一般错误:1366 不正确的字符串值:第 1 行的列“meta_content”的“\xA0nol x...”

我正在使用 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 替换那个讨厌的字符有什么想法吗?

【问题讨论】:

  • 你能把正在插入的行也显示出来吗?
  • 给出数据库信息:MySQL版本、数据库/表排序规则等
  • 我喜欢转换为 UTF8 的建议,我现在正在研究,我也在研究获取查询,brb
  • 成功了! =]

标签: php mysql regex preg-replace


【解决方案1】:

我建议您将表格转换为 UTF8,以便支持所有字符。

但要回答这个问题,根据$contentpl�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

【讨论】:

    【解决方案2】:

    您的问题肯定在您的内容字符串的这部分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);
    

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多