在PHP中从字符串构建精简的HTML数组

在PHP中从字符串构建精简的HTML数组,php,html,Php,Html,我有一个字符串,看起来像这样: $html_string = "<p>Some content</p><p>separated by</p><p>paragraphs</p>" 实际上,它给出了: array('Some content', 'separated by', 'paragraphs'); 有没有更好、更健壮的方法从HTML标记创建数组,我没有看到任何关于通过正则表达式进行解析的内容 谢谢你的帮助 如果需要

我有一个字符串,看起来像这样:

$html_string = "<p>Some content</p><p>separated by</p><p>paragraphs</p>"
实际上,它给出了:

array('Some content', 'separated by', 'paragraphs'); 
有没有更好、更健壮的方法从HTML标记创建数组,我没有看到任何关于通过正则表达式进行解析的内容


谢谢你的帮助

如果需要在php中进行一些html解析,有一个很好的库,名为
PHPHTMLParser
。 它可以为您提供一个类似jquery的api来解析html

例如:

// Assuming you installed from Composer:
require "vendor/autoload.php";
use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->load('<p>Some content</p><p>separated by</p><p>paragraphs</p>');
$pTags = $dom->find('p');
foreach ($pTags as $tag)
{    
    // do something with the html
    $content = $tag->innerHtml;

 }
//假设您是从Composer安装的:
需要“vendor/autoload.php”;
使用phtmlparser\Dom;
$dom=新的dom;
$dom->load(“某些内容由段落分隔”);
$pTags=$dom->find('p');
foreach($ptag作为$tag)
{    
//用html做些什么
$content=$tag->innerHtml;
}

如果只是这么简单,内容中没有/没有太多其他标记,您只需使用regex即可:

$string = '<p>Some content</p><p>separated by</p><p>paragraphs</p>';

preg_match_all('/<p>([^<]*?)<\/p>/mi', $string, $matches);

var_dump($matches[1]);
请记住,这不是最有效的方法,也不是最快的方法,但它比使用DOMDocument或类似的方法要短。这里是解决方案(本机PHP),当您的
p
标记具有属性或包含其他标记(如

<,或者在它们之间有很多空白(这与HTML呈现无关),或者包含HTML实体,如
等:

$html_string = "<p>Some content</p><p>separated by</p><p>paragraphs</p>";
$doc = new DOMDocument();
$doc->loadHTML($html_string);

foreach($doc->getElementsByTagName('p') as $p ) {
    $paras[] = $p->textContent;
}

// Output array:
print_r($paras);
$html_string=“某些内容

段落

分隔”; $doc=新的DOMDocument(); $doc->loadHTML($html\u字符串); foreach($doc->getElementsByTagName('p')作为$p){ $paras[]=$p->textContent; } //输出阵列: 印刷(第2-3段);
如果您确实想使用正则表达式,那么至少允许标记属性和HTML实体,将后者转换为相应的字符:

$html_string = "<p>Some content &amp; text</p><p>separated&nbsp;by</p><p style='background:yellow'>paragraphs</p>";

preg_match_all('/<p(?:\s.*?)?>\s*(.*?)\s*<\/p\s*>/si', $html_string, $matches);

$paras = $matches[1];
array_walk($paras, 'html_entity_decode');

print_r($paras);
$html\u string=“某些内容和文本由

段落隔开”; preg_match_all('/\s*(.*?\s*/si',$html_string,$matches); $paras=$matches[1]; 数组_walk($paras,'html_entity_decode'); 印刷(第2-3段);


使用
DOMDocument
SimpleXML
extensionDOMDocument进行解析是解析HTML的最佳方法,但也有用于正则表达式分解的方法
$html_string = "<p>Some content</p><p>separated by</p><p>paragraphs</p>";
$doc = new DOMDocument();
$doc->loadHTML($html_string);

foreach($doc->getElementsByTagName('p') as $p ) {
    $paras[] = $p->textContent;
}

// Output array:
print_r($paras);
$html_string = "<p>Some content &amp; text</p><p>separated&nbsp;by</p><p style='background:yellow'>paragraphs</p>";

preg_match_all('/<p(?:\s.*?)?>\s*(.*?)\s*<\/p\s*>/si', $html_string, $matches);

$paras = $matches[1];
array_walk($paras, 'html_entity_decode');

print_r($paras);