2017-12-11 4 views
0

多くのテキストを含むデータベース行がありますが、特定のテキストのみを選択したいだけです。PHP要素の前後のテキストを削除します

例:

<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要素とのイプサムの一部を選択し、残りを無視したいです。私はDOMXPath->evaluate('//text()[contains()]')と仕事をしようとしていたが、これは唯一の要素ではなく、ipsumのテキストを示しています。

EDIT: 私が望む正確な出力は次のようになります。

<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; 

これが唯一のイプサムを示しリスト要素ではなくテキストです。

+0

正確な出力を追加して質問を編集できますか? –

+0

そしてコードはあなたがそのファイルを使用したと言っています – Andreas

+1

"Ipsum part"とは何ですか?それは常に "Ipsum"の正確な単語で強くなっているのですか、それとも常に3つの文字列タグの2番目ですか? – Andreas

答えて

1

あなたは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> 
+0

ありがとう!これはトリックでした。 –

0

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

関連する問題