簡體   English   中英

PHP Regex檢索HTML標簽之間的文本,但不檢索標簽之間的文本

[英]PHP Regex to Retrieve the Text between HTML tags but not tags

可能會多次詢問類似的問題,但是我有一個復雜的問題。
我知道在這種情況下,當我們只想解析<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>標記包括在輸出中,這是我不想要的。
我只需要Java1PHP1文本,我想如果能夠通過排除標簽來檢索標簽之間的文本,我可能會接受。
我對么? 還是錯? 如果是這樣,如何實現我想要的?
提前致謝!!

您需要preg_match_all(),並確保您未使用“ s”模式修飾符:

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

我認為您的regex方法雖然在技術上是可行的,但會給您帶來更多麻煩。 例如,如果源HTML更改了,則headers屬性出現在class屬性之前,則regex將失敗。 另外,如果您使用正則表達式來搜索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:XPath over。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM