PHP Regex在HTML标记之间检索文本,但不检索标记

时间:2014-12-09 22:50:05

标签: php regex preg-match preg-match-all

可能会多次询问类似的问题,但我有点复杂。
我知道在这种情况下我们只想解析<title>标签之间的文字,

<title>My work</title>
<p>This is my work.</p> <p>Learning regex.</p>

我们可以形成这样的正则表达式:

>([^<]*)<

Source

但这仅仅是因为<title>标签位于顶部。但如果标签是第二个,它将无法工作 好的,我的情景是,

<td class="td1" headers="searchth1">JAVA1</td>
<td class="td2" headers="searchth2">JAVA2</td>
<td class="td3" headers="searchth3">JAVA3</td>

<td class="td1" headers="searchth1">PHP1</td>
<td class="td2" headers="searchth2">PHP2</td>
<td class="td3" headers="searchth3">PHP3</td>

文件中有许多类似的标记,我只想检索<td class="td1" headers="searchth1"></td>标记之间的文字。
而且,我使用了'#<td class="td1" headers="searchth1">(.*)</td>#',这工作正常。但它也包括输出中的所有其他<td>标记,我不想要 我只想要文本Java1PHP1,我想如果我能够通过排除标签来检索标签之间的文本,我可以解决它。
我对么?还是错了?如果是这样,如何实现我想要的呢? 提前致谢!!

2 个答案:

答案 0 :(得分:0)

你想要preg_match_all(),并确保你没有使用&#34; s&#34;模式修饰符:

$regexp = '%<td class="td1" headers="searchth1">(.*)</td>%';
preg_match_all($regexp,$html,$matches);

答案 1 :(得分:0)

我认为你的正则表达式方法虽然在技术上可行,但会导致更多麻烦。例如,如果源HTML已更改,则headers属性出现在class属性之前,正则表达式将失败。此外,如果您使用正则表达式搜索HTML源代码,您的代码将变得非常难以理解。

要解析HTML,您应该使用PHP的DOMDocument函数,这些函数在更改HTML代码时更加健壮,并且对于维护代码(包括您)的人来说更具可读性。此方法还将支持更轻松地查看其他元素属性。下面的示例代码适用于您的用例:

$doc = '<td class="td1" headers="searchth1">JAVA1</td>
<td class="td2" headers="searchth2">JAVA2</td>
<td class="td3" headers="searchth3">JAVA3</td>
<td class="td1" headers="searchth1">PHP1</td>
<td class="td2" headers="searchth2">PHP2</td>
<td class="td3" headers="searchth3">PHP3</td>';
$dom = new DOMDocument();
$dom->loadHTML($doc);
$xpath = new DOMXpath($dom);
$tds = $xpath->query("//td[@class='td1']");
// the query could also be "//td[@headers='searchth1']" or even
// "//td[@headers='searchth1'][@class='td1']" depending on what you want to target
foreach($tds as $td){
    var_dump($td->nodeValue);
}

如果您想了解有关构建和使用xpath查询的更多信息,请参阅SitePoint.com上的文章PHP DOM: Using XPath