2017-12-11 10 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 요소와 Ipsum의 부분을 선택하고 나머지는 무시해야합니다. 내가 DOMXPath->evaluate('//text()[contains()]')와 함께 일하려고했지만 이것은 단지 요소가 아닌 입스문 텍스트만을 보여줍니다.

편집 : 내가 원하는 정확한 출력은 다음과 같습니다

<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 제품을 보여줍니다 텍스트가 아니라 목록 요소.

+0

정확한 출력을 추가하여 질문을 편집 할 수 있습니까? –

+0

그리고 그 코드를 사용했다고 말하면 – Andreas

+1

"Ipsum part"은 무엇입니까? 항상 "Ipsum"이라는 단어와 정확히 일치합니까? 아니면 항상 3 개의 문자열 태그 중 두 번째입니까? – Andreas

답변

1

$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); 
는 방법은 내가 ... 그것을 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과 함께 강한 태그를 캡처하고 다음에 강한 태그 또는 문자열의 끝으로 내려갑니다. 당신은이 개 노드를 얻으려고 노력으로

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