我知道这是可能的,但对于我的生活,我无法解决它。
请考虑以下方案:
$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 演示