取得第一個段落之後的標題:XPath
P粉447002127
2023-08-20 20:52:45
<p>我想在我的網站上新增一個FAQPage架構。 </p>
<p>為了做到這一點,我需要找到每一個帶有問號的<code><h2></code>或<code><h3></code>標籤。那就是問題。 </p>
<p>之後,我需要將標題後面的第一個<code><p></code>標籤作為答案。 </p>
<p>最終結果應該如下:</p>
<pre class="brush:php;toolbar:false;">{
"@type": "Question",
"name": "處理退款需要多久時間?",
"acceptedAnswer": {
"@type": "Answer",
"text": "從第一個P標籤取得的內容",
"url": "https://www.example.com/answer#anchor_link"
}
}</pre>
<ul>
<li>問題的<code>"name"</code>是<code><h2></code>或<code><h3></code>標籤。 </li>
<li>答案的<code>"url"</code>是從<code><h2></code>或<code><h3></code>標籤中取得的永久連結和錨鏈接。 </li>
<li><strong>這兩個參數已經解決了</strong></li>
</ul>
<p>不幸的是,我無法找到如何取得標題標籤後的第一個段落標籤。</p>
<p>我需要在以下行中取得第一個段落的內容:</p>
<pre class="brush:php;toolbar:false;">"text": "從第一個P標籤取得的內容",</pre>
<p>這是我目前的程式碼:</p>
<pre class="brush:php;toolbar:false;"><?php
$content_postid = get_the_ID();
$content_post = get_post($content_postid);
$content = $content_post->post_content;
$content = apply_filters('the_content', $content);
$content = str_replace(']]>', ']]>', $content);
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
$xp = new DOMXPath($dom);
$query = "//h2[contains(., '?')] | //h3[contains(., '?')]";
$nodes = $xp->query($query);
$stack = [];
if ($nodes) {
$faq_count = count($nodes);
$faq_i = 1;
echo '
<script type="application/ld json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [';
foreach($nodes as $node) {
echo '{
"@type": "Question",
"name": "'.$node->nodeValue.'",
"acceptedAnswer": {
"@type": "Answer",
"text": "從第一個P標籤取得的內容",
"url": "'.get_permalink().'#'.$node->getAttribute('id').'"
}
}';
if ($faq_i != $faq_count) : echo ','; endif; $faq_i ;
}
echo ']}</script>';
}
?></pre>
<p>如你所看到的,我使用這行程式碼來找出每一個有<code>?</code>的<code><h2></code>或<code><h2></code>或<code> ;<h3></code>標籤:</p>
<pre class="brush:php;toolbar:false;">$query = "//h2[contains(., '?')] | //h3[contains(., '?')]"; </pre>
<p>我猜我需要一個第二個<code>$query</code>來找到標題後的段落?但是如何檢查標題後的第一個標籤呢?</p>
<p>我嘗試了這個額外的詢問:</p>
<pre class="brush:php;toolbar:false;">$query2 = "//h2[contains(., '?')]/following-sibling::p[1] | //h3[contains (., '?')]/following-sibling::p[1]";</pre>
<p>但是<code>following-sibling::</code>和<code>following::</code>都不起作用。
它總是顯示最後一個標題後的段落。 </p>
<p>我需要解決第一個查詢嗎?以了解我在什麼級別? </p>
<p>這是<code>$content_post</code>的範例(它總是不同的):</p>
<pre class="brush:php;toolbar:false;"><h2>Lorem ipsum dolor sit amet?</h2>
<p>consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim</p>
<p>veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
<h3>Duis autem vel eum?</h3>
<p>iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandit praisal soolall alrme alole abeberm 片>
<h2>Nam liber tempor cum soluta?</h2>
<h3>nobis eleifend option congue nihil</h3>
<p>imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laore dolunt sed diam nonummy nibh euimod tincidunt ut laore dolunt mia&al;
<p>Et wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
<h3>Duis autem vel?</h3>
<p>eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandla facilisis at vero et accum桑;/p>
<h4>Nam liber tempor cum soluta nobis</h4>
<p>eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</p></pre>
<p><br /></p>
嘗試將您的
foreach
更改為以下內容,看看是否有效。