Preg Match帮助-在未知类的标签之间查找内容

时间:2018-10-19 07:52:32

标签: php preg-match

我知道这是可能的,但是对于我一生,我无法解决。

考虑这种情况:

$html = '<tr>
    <td>Some Marker I know<td>
    <td>This is what I want</td>
<tr>

因此preg_match类似于:

preg_match_all( '#Some Marker I know<td><td>(.*?)</td>#', $html, $match );

但是我不确定某些事情,因此需要一些可以提高灵活性的设计

示例:

$html = '<tr class='unknown another' id='no idea'>
    <td attribute='no idea' class='no idea'>Some Marker I know<td>
    <label>This is what I want</label>
<tr>

注意,我已更改: -类和ID-可能存在或可能不存在 -html标签-可能不是TD(可能是DIV),但始终是下一个。

所以要弄清楚我想得到的是字符串“这就是我想要的”

在英语中,搜索词的含义类似于:

  • 获取下一个标签/元素的内容
  • 上一个元素的内容是“我知道的某些标记”
  • 但是中间的标签可能(也可能没有)具有类,ID等

我知道这不是最简单的例子,但是我很确定您可以在其中使用通配符来帮助它。

谢谢!

1 个答案:

答案 0 :(得分:2)

在PHP中处理HTML的首选方法是使用DomDocument类。将HTML读入DomDocument后,即可使用DomXPath进行搜索。在这种情况下,我们要搜索具有文本值Some Marker I know的元素之后的元素。的XPath是

//*[text()="Some Marker I know"]/following-sibling::*

我们可以像这样在PHP中使用它:

$html = "<tr class='unknown another' id='no idea'>
    <td attribute='no idea' class='no idea'>Some Marker I know<td>
    <label>This is what I want</label>
<tr>";
$doc = new DomDocument;
$doc->loadHTML($html);
$xpath = new DomXPath($doc);
$marker = $xpath->query('//*[text()="Some Marker I know"]/following-sibling::*');
echo(trim($marker[0]->nodeValue));

输出:

This is what I want

Demo on 3v4l.org