在PHP

时间:2016-08-12 20:35:04

标签: php html

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

$html_string = "<p>Some content</p><p>separated by</p><p>paragraphs</p>"

我想对标签内的内容进行一些解析,所以我认为从这里创建一个数组是最容易的。目前,我正在使用一系列explodeimplode来实现我想要的目标:

$stripped = explode('<p>', $html_string);
$joined = implode(' ', $stripped);
$parsed = explode('</p>', $joined);

实际上给出了:

array('Some content', 'separated by', 'paragraphs'); 

是否有更好,更健壮的方法从HTML标签创建数组? Looking at the docs,我没有看到通过正则表达式解析的任何提及。

感谢您的帮助!

3 个答案:

答案 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 parserhttps://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呈现无关),或包含&nbsp;&lt;等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 &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);