【问题标题】:Split string into associative array [duplicate]将字符串拆分为关联数组[重复]
【发布时间】:2016-02-22 15:21:06
【问题描述】:

示例字符串(html内容):

some content
<h2>title 1</h2>
<p>more content</p>
<h2>title 2</h2>
rest of the content

我需要通过&lt;h2&gt;&lt;/h2&gt; 将其拆分为关联数组,但保留字符串的所有内容。

期望的输出:

array(){
  'text1' => 'some content',
  'title1' => 'title 1',
  'text2' => '<p>more content</p>',
  'title2' => 'title 2',
  'text3' => 'rest of the content'
}

array(){
  [0] => {
    'text' => 'some content',
    'title' => 'title 1'
  },
  [1] => {
    'text' => '<p>more content</p>',
    'title' => 'title 2'
  },
  [2] => {
    'text' => 'rest of the content'
  }
}

我尝试了什么

preg_split()PREG_SPLIT_DELIM_CAPTURE 几乎可以完成这项工作,但它会输出索引数组。
我尝试使用正则表达式,但无法捕获 text3
(.*?)(&lt;h2.*?&lt;\/h2&gt;)

非常感谢任何帮助或想法。

【问题讨论】:

  • 这些换行符是实际的新行吗?
  • 是“一些内容”、“更多内容”……只有文本还是 html?
  • 是的,内容是 HTML。
  • 使用这个(?s)(?:&lt;h2&gt;(.*?)&lt;/h2&gt;|\s*(.+?)\s*(?=&lt;h2&gt;.*?&lt;/h2&gt;|$)) 忘记那个重复的垃圾。如果 html 被垃圾,使用 DOM 解析 html 将失败。使用有效的东西。或者,您可以尝试找到可以通过格式错误的 html 的 DOM 解析器(但您不能)。
  • 我去看看,谢谢。

标签: php arrays regex split preg-split


【解决方案1】:

您应该能够进行正则表达式拆分:

preg_split ("/<\/?h2>/", sampletext)

此处的 sampletext 看起来就像您的输入示例。我们可以假设每 2 次拆分相当于一个 &lt;h2&gt;&lt;/h2&gt; 对,因此您可以根据它们的数组索引对它们进行标记。

【讨论】:

    【解决方案2】:

    我很快就为你做了一个功能,它只在你的内容上进行了测试,但也许对你有帮助。

    <?php
    function splitTitlesAndContent($needle1,$needle2,$content){
        $spli = explode($needle1,$content);
        $arr = array();
        $titlenum = 1;
        $contentnum = 1;
    
        foreach($spli as $spl){
            $expl = explode($needle2,$spl);
    
            if(isset($expl[1])){
                $arr['title' . $titlenum] = trim($expl[0]);
                $titlenum++;
    
                $arr['content' . $contentnum] = trim($expl[1]);
                $contentnum++;
            }
            else{
                $arr['content' . $contentnum] = trim($expl[0]);
                $contentnum++;
            }
        }
        return $arr;
    }
    
    $content = 'some content
    <h2>title 1</h2>
    more content
    <h2>title 2</h2>
    rest of the content';
    
    $splitted = splitTitlesAndContent('<h2>','</h2>',$content);
    print_r($splitted);
    ?>
    

    您可以在这里试用:http://sandbox.onlinephpfunctions.com/code/e80b68d919c0292e7b52d2069128e21ba1614f4c

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-19
      • 2018-10-07
      • 2011-12-20
      • 1970-01-01
      • 2013-01-03
      • 2016-01-15
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多