【问题标题】:how to randomly insert html inside of html string without causing invalid html如何在 html 字符串中随机插入 html 而不会导致 html 无效
【发布时间】:2013-08-14 09:48:42
【问题描述】:

我已经为一个项目编写了一个内容生成器工具,以帮助我将虚假内容批量导入数据库的文本字段。它只是帮助使网站看起来很拥挤。

我正在使用一个名为 lorem-php-sum 的外部类来实际生成我要插入的字符串。它真的非常简单,它只是插入包裹在<p> 标签中的文本段落(每次随机数),然后我将这些字符串插入我选择的表中的一个大循环中。

现在的问题是,我想稍微提前一下随机生成的内容,并添加一些 html 列表标签、水平线标签和其他内容。我希望我的新 html 元素随机放置在从该段落生成器类返回的段落中。

问题是,虽然我可以在某个随机点轻松地将列表标签插入到我的大段落字符串中,但我担心有时它可能会以破坏 html 的方式将我的新 html 标签插入现有标记中。

有没有人有将带有一些规则的 html 插入另一个字符串的技巧?我想也许 php domDocument 类可以帮助解决这个问题,但现在不确定?

【问题讨论】:

    标签: php domdocument


    【解决方案1】:

    您需要在生成器中加入某种状态机。

    你可以这样想:

    Step1:选择要渲染的元素:文本节点、段落、列表节点。

    当您选择一个文本节点时,您会随机生成一些文本并返回到第 1 步。

    当您选择一个段落时,您发出 <p> 并生成一些文本,发出 </p> 并返回到第 1 步。

    对于列表节点,您只能创建列表元素<li>,因此选择随机数量的元素并使用与步骤 1 相同的规则填充它们。

    --

    您也可以允许嵌套。在<li> 中可以添加<strong><em><p> 类似。

    我想你可以让它变得疯狂:)

    稍微调整系数以获得良好的结果。尝试制作一个生成随机但可预测的输出的生成器,总长度可能是控制的好东西。

    【讨论】:

    • 嗨弗里斯。你觉得这可以用 domDocument 实现吗?
    • 不,你不需要它。你只是在生成字符串。
    【解决方案2】:

    您可以分层循环遍历多维数组。没有行没有单元格,没有没有表格的行,因此没有没有ul的li。

    $tags = array("<table>%s</table>\n" , 
                    array ("  <tr>%s</tr>\n" , 
                      array("    <td>%s</td>\n)),
                  "<ul>%s</ul>\n",
                    arrray ("  <li>%s</li>\n") //continue with more tags
            ); 
    $tags_simple = array("%s", "<strong>%s</strong>", 
                         "<i>%s</i>", "<p>%s</p>\n", "%s</ br>\n"
                        ); //etc, "%s" for a none tag, add more if you like
    

    从 $tags 中选择一个随机数,多循环它们,sprintf 随机句子并向它们添加随机简单标签。这是一个独立的可能性。

    【讨论】:

      【解决方案3】:

      所以我设法通过其他代码示例并使用 domDocument 解决了这个问题。 我最终创建了一个函数,该函数通过段落标签分解字符串并将其作为包含每个段落作为单独项目的数组返回。

      function splitTextByPara($string,$split_on="p"){
      // Add alternative tags to split on with syntax: |//ul|//br 
      
      $dom = new DOMDocument();
      $dom->loadHTML($string);
      $domx = new DOMXPath($dom);
      $entries = $domx->evaluate("//".$split_on);
      $result = array();
      foreach ($entries as $entry) {
          $result[] = $entry->ownerDocument->saveHTML( $entry );
      }
      
      // re-encode to utf8
      $result = array_map("utf8_decode", $result);
      
      return $result;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 2015-04-04
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 2023-02-21
        相关资源
        最近更新 更多