Php 将文本内容拆分为数组-当块元素之间没有包装时

Php 将文本内容拆分为数组-当块元素之间没有包装时,php,arrays,Php,Arrays,我正在尝试刮一点html和结构是这样出来的 array( "<p>1. paragraph paragraph</p>", "<p>2. paragraph paragraph</p>", "<p>3a. paragraph paragraph</p><p>3b. paragraph paragraph</p>", "<p>4. paragraph paragraph</p>"

我正在尝试刮一点html和结构是这样出来的

array(
"<p>1. paragraph paragraph</p>",
"<p>2. paragraph paragraph</p>",
"<p>3a. paragraph paragraph</p><p>3b. paragraph paragraph</p>",
"<p>4. paragraph paragraph</p>"
):
//大宗报价

<h2>1. text text</h2>
<p>1. paragraph paragraph</p>
<h2>2. text text</h2>
<p>2. paragraph paragraph</p>
<h2>3. text text</h2>
<p>3a. paragraph paragraph</p>
<p>3b. paragraph paragraph</p>
<h2>4. text text</h2>
<p>4. paragraph paragraph</p>
1。文本
一,。段落

2.文本 二,。段落

3.文本 3a。段落

3b。段落

4.文本 四,。段落

--因此,最初它与段落标记挂钩,但我注意到有些块有不止一个段落。在这一点上,我不确定如何调整爆炸功能,我已经到位

$paras = explode("<p>", $paras);
$paras=explode(,$paras);
最后一个数组需要看起来更像这样

array(
"<p>1. paragraph paragraph</p>",
"<p>2. paragraph paragraph</p>",
"<p>3a. paragraph paragraph</p><p>3b. paragraph paragraph</p>",
"<p>4. paragraph paragraph</p>"
):
数组(
“1.段落

”, “2.段落

”, “3a.段段

3b.段

”, “4.段落

” ):
这就是代码当前的外观

foreach($lookuphtml->find('blockquote') as $text) {
            $paras = $text->innertext;
            $paras = explode("<p>", $paras);
        }
foreach($lookuphtml->find('blockquote')作为$text){
$paras=$text->innertext;
$paras=爆炸(“”,$paras);
}
//实际内容如下所示

<blockquote><h2 class="left">History</h2><p>Opened October 1997 as the first brewery in Bath since 1956.  The brewery is located in an outbuilding behind Ye Old Farmhouse public house.</p><h2 class="left">Beers Brewed</h2><p>We do not maintain a list of beers brewed by each brewery.  There may be a list on the brewery's own website and we suggest you also visit the entry for  Abbey Ales Ltd on the independent <a href="http://www.beermad.org.uk/brewery/2" rel="external" target="_blank">www.beermad.org.uk</a>.</p><h2 class="left">Regular Outlets</h2><p>The brewery has 4 pubs :</p><p>The Star, 23 Vineyards, Bath, BA1 5NA <br>The Coeur de Lion, Northumberland Place, Bath, BA1 5AR<br>The Foresters, 58 Goose Street, Beckington, Frome, BA11 6SS<br>The Assembly, 16-17 Alfred Street, Bath, BA1 2QU</p><h2 class="left">Visit Information</h2><p>Information on visit availability can be found on the breweries web site.</p><h2 class="left">Brewery Shop Information</h2><p>The brewery does not have a shop, but sells a variety of items via it's web site.</p></blockquote>
History1997年10月开业,是自1956年以来巴斯的第一家啤酒厂。啤酒厂位于Ye Old Farmhouse酒店后面的一个外屋。

酿造的啤酒我们没有每个啤酒厂酿造的啤酒列表。啤酒厂自己的网站上可能会有一个列表,我们建议您也访问《独立报》上的Abbey Ales Ltd.

常规门店啤酒厂有4家酒吧:

星星,23个葡萄园,巴斯,Bah,BA1 5NA
狮子会,Northumberland Place,Bah,BA1 5AR
福里斯特,58号,贝金顿,弗罗姆,BA11 6SS
BA1 2QU巴斯阿尔弗雷德街16-17号集会

参观信息可在啤酒厂网站上找到参观信息。

啤酒厂商店信息啤酒厂没有商店,但通过其网站销售各种商品

…回答

别介意,伙计们,这是解决办法

foreach($lookuphtml->find('blockquote') as $text) {
    $paras = $text->innertext;

    $paras = preg_replace("/<h2 class=\"left\">(.*?)<\/h2>/", "#~", $paras);
    $pa = explode("#~", $paras);
    $pa2 = array_splice($pa, 1);
}
foreach($lookuphtml->find('blockquote')作为$text){
$paras=$text->innertext;
$PARATS=preg_替换(“/(*?/”,“#~”,$PARATS);
$pa=爆炸(“#~”,$PARTS);
$pa2=阵列拼接($pa,1);
}
使用SimpleXML:

$string = <<<XML
<root>
<h2>1. text text</h2>
<p>1. paragraph paragraph</p>
<h2>2. text text</h2>
<p>2. paragraph paragraph</p>
<h2>3. text text</h2>
<p>3a. paragraph paragraph</p>
<p>3b. paragraph paragraph</p>
<h2>4. text text</h2>
<p>4. paragraph paragraph</p>
</root>
XML;

$xml = simplexml_load_string($string);
$p = (array)($xml->p);

$result = [];
foreach ($p as $item) {
    preg_match('/(\d+)/', $item, $matches);
    $number = isset($matches[0]) ? $matches[0] : $item;
    $result[$number] = isset($result[$number]) ? $result[$number] : '';
    $result[$number] .= '<p>' . $item . '</p>';
}

print_r(array_values($result));
$string=print_r(数组值($result));
排列
(
[0]=>1.段落

[1] =>2.段落

[2] =>3a.段落段落

3b.段落段落

[3] =>4.段落

)
——这可能起作用,但似乎很复杂——它不是一个复制品——你可以从结构中看到没有钩子进入-所以我需要一个更手动的解决方案来清理这个问题——但是它不会正确地提取第3段-它会认为它是数组中的一个不同元素。“3。第3段。段落段落

”,@PaulCrovella——它提取数据——但它没有将段落放入正确的批处理中。第3节中的两个段落将被视为数组中的下一个元素——它们没有被批处理在一起——“h2”和段落块之间没有包装“--我得到了那个结果--这就是问题所在,伙计--我只需要3.2段。所以[2]=>3。第3段。第[3]段=>4。段落段落已编辑。添加了仍然缺少两个段落的
array\u unique()
,此处需要以下最终输出--array([0]=>“1.段落”[1]=>“2.段落”[2]=>“3.段落,3.段落”[3]=>“4.段落”)你的解决方案仍然不正确