我有一个看起来像这样的字符串:
$html_string = "<p>Some content</p><p>separated by</p><p>paragraphs</p>"
我想对标签内的内容进行一些解析,所以我认为从这里创建一个数组是最容易的。目前,我正在使用一系列explode
和implode
来实现我想要的目标:
$stripped = explode('<p>', $html_string);
$joined = implode(' ', $stripped);
$parsed = explode('</p>', $joined);
实际上给出了:
array('Some content', 'separated by', 'paragraphs');
是否有更好,更健壮的方法从HTML标签创建数组? Looking at the docs,我没有看到通过正则表达式解析的任何提及。
感谢您的帮助!
答案 0 :(得分:1)
如果只是那么简单,内容中没有/没有太多其他标签,你可以简单地使用正则表达式:
$string = '<p>Some content</p><p>separated by</p><p>paragraphs</p>';
preg_match_all('/<p>([^<]*?)<\/p>/mi', $string, $matches);
var_dump($matches[1]);
创建此输出:
array(3) {
[0]=>
string(12) "Some content"
[1]=>
string(12) "separated by"
[2]=>
string(10) "paragraphs"
}
请记住,这不是最有效的方式,也不是最快的方式,但它比使用DOMDocument或类似的东西更短。
答案 1 :(得分:0)
如果你需要在php中进行一些html解析,那么有一个很好的库,名为php html parser
。
https://github.com/paquettg/php-html-parser
它可以给你一个类似api的jquery来解析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;
}
答案 2 :(得分:0)
以下是DOMDocument解决方案(原生PHP),当p
标记具有属性或包含其他标记(如<br>
)或具有大量空白区域时,它也会起作用在它们之间(与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实体,将后者翻译成相应的字符:
$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);