【问题标题】:PHP & mySQL - Parse/Separate Single HTML Field Text Into 2 VariablesPHP & mySQL - 将单个 HTML 字段文本解析/分离为 2 个变量
【发布时间】:2012-12-16 06:52:24
【问题描述】:

提前感谢您抽出宝贵时间解决我的问题。

我正在使用 PHP 脚本来查询 mySQL 数据库。不幸的是,产品描述、成分和附加信息(最后的段​​落)都与名称一起存储在一个字段中(名称是多余的,可以忽略)。所有文本都包含在 HTML 代码中。我不想保留或存储任何 HTML 代码,但它可能用作分隔符。

重要提示: HTML 是编码存储的,所以

<p> 

存储为

&lt;p&gt;

这是一个存储在 mySQL 数据库中的 HTML 代码示例(这是它的确切存储方式。正如我之前提到的,HTML 是经过编码的。):

&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot;&gt;
&lt;tbody&gt;
    &lt;tr valign=&quot;top&quot;&gt;
        &lt;td&gt;
            Item:&lt;/td&gt;
        &lt;td&gt;
            Olive Loaf - Baked - &lt;b&gt;Gluten Free!&lt;/b&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr valign=&quot;top&quot;&gt;
        &lt;td&gt;
            Description:&lt;/td&gt;
        &lt;td&gt;
            A blend of beef and pork along with our unique spices to create a base mix. To this mix we add plenty of olives and form it into a loaf, we then smoke this over natural hardwoods for a unique Koegel flavor.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr valign=&quot;top&quot;&gt;
        &lt;td&gt;
            Ingredients:&lt;/td&gt;
        &lt;td&gt;
            Beef and Pork, Water, Spanish Olives (Olives, Pimentos, Sodium Alginate, Guar Gum, Calcium Chloride, Water, Salt, Lactic Acid), Nonfat Dry Milk, Corn Syrup, Salt, Red Sweet Peppers (bell peppers, water, citric acid.), Spices, Dextrose, Dehydrated Onions.&lt;/td&gt;
    &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
    &lt;strong&gt;Each loaf weighs approximately 6 lbs.&lt;/strong&gt;&lt;/p&gt;

这里是相同的代码 sn-p 与 HTML 解码(这不是它在 mySQL 数据库中的存储方式。我提供这个只是为了视觉。):

<table border="0" cellpadding="2" cellspacing="2">
<tbody>
    <tr valign="top">
        <td>
            Item:</td>
        <td>
            Olive Loaf - Baked - <b>Gluten Free!</b></td>
    </tr>
    <tr valign="top">
        <td>
            Description:</td>
        <td>
            A blend of beef and pork along with our unique spices to create a base mix. To this mix we add plenty of olives and form it into a loaf, we then smoke this over natural hardwoods for a unique Koegel flavor.</td>
    </tr>
    <tr valign="top">
        <td>
            Ingredients:</td>
        <td>
            Beef and Pork, Water, Spanish Olives (Olives, Pimentos, Sodium Alginate, Guar Gum, Calcium Chloride, Water, Salt, Lactic Acid), Nonfat Dry Milk, Corn Syrup, Salt, Red Sweet Peppers (bell peppers, water, citric acid.), Spices, Dextrose, Dehydrated Onions.</td>
    </tr>
</tbody>
</table>
<p>
    <strong>Each loaf weighs approximately 6 lbs.</strong></p>

基本上,我想忽略名称,将描述和附加信息(描述下方的最后一段)保存为$productDescription(可能在描述后添加两个换行符以分隔附加信息),并将成分保存为$产品成分。我确实想要包含文本“描述:”或“成分:”......只是紧随其后的信息。 如上所述,我只对原始文本感兴趣——我不想保存任何 HTML 代码。将信息存储到 2 个变量中时,应忽略所有 HTML 代码。

非常感谢任何帮助!

谢谢,

-杰夫

编辑

mySQL 数据库连接到了一个 opencart 网站。在网站的管理方面,没有单独的成分、描述等字段。还有其他所有内容(重量、尺寸、SKU、型号等)。这是因为 opencart 网站并非专门用于食品。它可以用于电子产品,在这种情况下,不需要这些领域。店主(不是我)将所有这些信息输入到描述入口点。 HTML 可能会泄露这一点。该网站由另一个人管理(如果需要,我可以直接与他联系)。我不希望他或我自己更改 opencart 代码以添加额外的字段,除非它可以轻松完成。

向 opencart 网站添加其他字段是否容易?这样,描述字段可以是独占的。感谢您的回复。

【问题讨论】:

  • 我觉得你个人不对这种可怕的设计负责,但我无法抗拒 -1-ing 它。 "product description, ingredients, and additional information are all stored in one single field" 是开发者的噩梦。
  • 您首选的 XML 或 DOM 解析库是什么?你知道如何使用 SimpleXML、DOM 或 simple_html_dom 吗?
  • 当您使用此代码时,建议您花时间提取这些值并将它们存储到它们自己的列中。然而,将成分正确规范化到自己的一对多表中的过程自动化并不容易。
  • 我不对可怕的设计负责。这就是我向 SOF 寻求指导和建议的原因。发生的事情是 mySQL 数据库连接到一个 opencart 网站。在网站的管理方面,没有单独的成分、描述等字段。还有其他所有内容(重量、尺寸、SKU、型号等)。这是因为 opencart 网站并非专门用于食品。它可以用于电子产品,在这种情况下不需要这些领域。店主(不是我)将所有这些信息输入到描述入口点。 HTML 可能会泄露这一点。
  • ...续上:该网站由另一个人管理(如果需要,我可以直接与他联系)。我不希望他或我自己更改 opencart 代码以添加额外的字段,除非它可以轻松完成。我实际上将收集到的数据编码为 JSON,并由 iOS 应用程序读取。迈克尔:我对你列出的任何事情都不熟悉。不是重申我自己,但是向 opencart 网站添加其他字段是否容易?这样,描述字段可以是独占的。感谢您的回复。

标签: php html mysql database html-parsing


【解决方案1】:

这个问题很简单。我觉得骂做这个设计的人是错误的。他只是将实体化 HTML 的 sn-p 存储在数据库字段中。现在您正尝试从中提取特定信息。

显然,您在检索到其中一个项目时要做的第一件事就是去实体化它(将 &amp;lt; 转换为 &lt; 等)。 html_entity_decode 就是这样做的。

现在看起来您拥有的 html 格式正确。也就是说,&lt;p&gt;&lt;/p&gt; 元素等匹配正确。这很好,因为您可以使用 XML 库来操作它。

这是示例代码,来自我的一个项目。我还没有尝试在你的项目中调试它。

 $xml= simplexml_load_string("<?xml version='1.0'?>\n" . html_entity_decode($mydata);
 $ns = $xml->getNamespaces(true);
 foreach ($ns as $key => $val) {
    $xml->registerXPathNamespace($key, $val);
 }
 unset($ns);

现在您有了一个包含您的小文章的 simpleXML 对象。您可以使用各种 API 来提取您需要的数据。看看这里的一些例子。

http://php.net/manual/en/simplexml.examples-basic.php

我怀疑您将能够相当轻松地使用这些材料。

注意,在 cmets 中,有人说您应该尝试从这些 HTML 节中提取有趣的信息,并将其放入专门的列中。这可能是真的,尤其是当您必须搜索这些数据或即时更新它时。

但也可以将内容存储在 XML/HTML 中。如果需要搜索,可以使用 FULLTEXT 搜索。

编辑

您可能需要将 XML 内容包装在单个 &lt;article&gt; ... &lt;/article&gt; 节中,就像这样。最后一项,即关于面包重量的段落,可能被认为是额外的而被拒绝。

 $xml= simplexml_load_string("<?xml version='1.0'?>\n<article>\n" .
    html_entity_decode($mydata) . "\n</article>\n";
 

至少对我来说,处理 XML 有点费力。

【讨论】:

  • 我在尝试您的解决方案时遇到了一个奇怪的错误:Warning: simplexml_load_string(): Entity: line 4: parser error : Extra content at the end of the document in - on line 112 Warning: simplexml_load_string(): in - on line 112 Warning: simplexml_load_string(): ^ in - on line 112 Fatal error: Call to a member function getNamespaces() on a non-object in - on line 113
  • 您的文章似乎包含不止一个顶级节。查看我的编辑。
  • 好的,我遇到了entity 'nbsp' not defined... 错误,但我创建了一个函数来删除&amp;nbsp;。这是我正在使用的代码:PasteBin,这是我的输出:PasteBin。我收到了Fatal error: Call to a member function getNamespaces() on a non-object in
  • 再次感谢您帮助我完成这一切。
猜你喜欢
  • 1970-01-01
  • 2018-07-31
  • 2021-11-08
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多