[英]PHP Remove text before and after element
我有一些包含很多文本的數據庫行,但是我只想選擇一個特定的文本。
例:
<strong>Lorem</strong>
<ul>
<li>Lorem</li>
<li>Ipsum</li>
</ul>
<strong>Ipsum</strong>
<ul>
<li>Ipsum</li>
<li>Lorem</li>
</ul>
<strong>Third</strong>
<ul>
<li>Some words</li>
<li>More words</li>
</ul>
我只想選擇帶有ul元素的Ipsum部分,而忽略其余部分。 我正在嘗試使用DOMXPath->evaluate('//text()[contains()]')
但這僅顯示Ipsum文本,而不顯示元素。
編輯:我想要的確切輸出是:
<strong>Ipsum</strong>
<ul>
<li>Ipsum</li>
<li>Lorem</li>
</ul>
我嘗試過的代碼(我嘗試了更多,但這是最后的結果):
$d = new DOMDocument;
$d->loadHTML($text);
$x = new DOMXPath($d);
$result = $x->evaluate("//text()[contains(., 'Ipsum')]");
$result->item(0)->nodeValue;
這僅顯示Ipsum文本,而不顯示列表元素。
當您嘗試獲取2個節點時,我做的方法是使用2個XPath表達式...
$d = new DOMDocument;
$d->loadHTML($text);
$x = new DOMXPath($d);
$result = $x->evaluate("//strong[contains(., 'Ipsum')]");
$result1 = $x->evaluate("//strong[contains(., 'Ipsum')]/following-sibling::ul");
echo $d->saveHTML($result->item(0)).PHP_EOL;
echo $d->saveHTML($result1->item(0)).PHP_EOL;
哪個輸出。
<strong>Ipsum</strong>
<ul>
<li>Ipsum</li>
<li>Lorem</li>
</ul>
您可以使用preg_match。
它不是HTML和XML的理想工具,但可以使用足夠嚴格的模式。
此模式使用Ipsum捕獲強標簽,並捕獲到下一個強標簽或字符串結尾。
$re = '/(<strong>Ipsum<\/strong>.*?)(<strong>|\z)/s';
$str = '<strong>Lorem</strong>
<ul>
<li>Lorem</li>
<li>Ipsum</li>
</ul>
<strong>Ipsum</strong>
<ul>
<li>Ipsum</li>
<li>Lorem</li>
</ul>
<strong>Third</strong>
<ul>
<li>Some words</li>
<li>More words</li>
</ul>';
preg_match($re, $str, $match);
var_dump($matches);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.