在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 & text</p><p>separated 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 & text</p><p>separated 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);