簡體   English   中英

PHP刪除元素前后的文本

[英]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);

https://regex101.com/r/s0n0Em/2

暫無
暫無

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

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