在HTML标记之间获取文本

时间:2011-04-18 07:43:18

标签: php html arrays string preg-match

好的,这是一个非常基本的问题我确定但是我是PHP的新手并且无法弄明白。输入字符串是$ data我试图继续拉动并仅使用第一个匹配。以下是不正确的?这甚至可能不是执行操作的最佳方式,我只是试图在两个html标签之间拉出内容(找到第一个集合)并丢弃其余数据。我知道有类似的问题,我已经阅读了它们,我的问题是混合,如果有更好的方法来做到这一点以及我如何定义匹配作为其余剩余代码的新输入。如果我将$ match更改为$ data2并从那里开始使用它会返回错误。

preg_match('/<h2>(.*?)<\/h2>/s', $data, $matches);

3 个答案:

答案 0 :(得分:22)

不要通过preg_match解析HTML,而是使用这个PHP类:

The DOMDocument class

示例:

<?php 

$html= "<p>hi</p>
<h1>H1 title</h1>
<h2>H2 title</h2>
<h3>H2 title</h3>";
 // a new dom object 
 $dom = new domDocument('1.0', 'utf-8'); 
 // load the html into the object 
 $dom->loadHTML($html); 
 //discard white space 
 $dom->preserveWhiteSpace = false; 
 $hTwo= $dom->getElementsByTagName('h2'); // here u use your desired tag
 echo $hTwo->item(0)->nodeValue; 
 //will return "H2 title";
 ?>

Reference

答案 1 :(得分:12)

使用正则表达式通常是您的问题的好主意。

当您查看http://php.net/preg_match时,您会看到$ matches将是一个数组,因为可能有多个匹配。尝试

print_r($matches);

了解结果的外观,然后选择正确的索引。

编辑:

如果匹配,则可以使用

获取括号内组之间提取的文本
print($matches[1]);

如果你有多个括号组,它们将被编号为2,3等。你也应该考虑没有匹配的情况,在这种情况下,数组的大小为0。

答案 2 :(得分:1)

你可以这样做::

$h1 = preg_replace('/<h1[^>]*?>([\\s\\S]*?)<\/h1>/',
'\\1', $h1);

这将从<H1></H1> HTML标签

中剥离或打开TEXT