可能会多次询问类似的问题,但我有点复杂。
我知道在这种情况下我们只想解析<title>
标签之间的文字,
<title>My work</title>
<p>This is my work.</p> <p>Learning regex.</p>
我们可以形成这样的正则表达式:
>([^<]*)<
但这仅仅是因为<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>
标记,我不想要
我只想要文本Java1
和PHP1
,我想如果我能够通过排除标签来检索标签之间的文本,我可以解决它。
我对么?还是错了?如果是这样,如何实现我想要的呢?
提前致谢!!
答案 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。