Preg 匹配帮助 - 查找具有未知类的标记之间的内容



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

请考虑以下方案:

$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 等

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

谢谢!

我在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

3v4l.org 演示

最新更新