문제

안녕하세요, 제가 하고 싶은 것은 첫 번째 문단의 내용을 가로채는 것입니다.문자열 $blog_post 다음 형식의 많은 단락이 포함되어 있습니다.

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>

내가 겪고 있는 문제는 첫 번째 사이의 모든 것을 가져오는 정규식을 작성하고 있다는 것입니다. <p> 태그와 첫 번째 종료 </p> 꼬리표.그런데 먼저 잡아먹는다. <p> 태그와 마지막 폐쇄 </p> 태그를 사용하면 모든 것을 잡을 수 있습니다.

내 현재 코드는 다음과 같습니다.

if (preg_match("/[\\s]*<p>[\\s]*(?<firstparagraph>[\\s\\S]+)[\\s]*<\\/p>[\\s\\S]*/",$blog_post,$blog_paragraph))
   echo "<p>" . $blog_paragraph["firstparagraph"] . "</p>";
else
  echo $blog_post;
도움이 되었습니까?

해결책

음, sysrqb에서는 단락에 다른 HTML이 없다고 가정하고 첫 번째 단락의 모든 항목을 일치시킬 수 있습니다.당신은 이와 같은 것을 더 원할 수도 있습니다

<p>.*?</p>

배치 ? 당신의 후에 * 탐욕스럽지 않게 만듭니다. 즉, 일치하기 전에 필요한 만큼의 작은 텍스트만 일치합니다. </p>.

다른 팁

당신이 사용하는 경우 preg_match, 사용 "유" 탐욕스럽지 않게 플래그를 지정합니다.

preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);

$matches[1] 그러면 첫 번째 단락이 포함됩니다.

아마 사용하는 것이 더 쉽고 빠를 것입니다. strpos() 첫 번째 위치를 찾으려면

 <p>

그리고 먼저

</p>

그런 다음 사용 하위 문자열() 단락을 추출합니다.

 $paragraph_start = strpos($blog_post, '<p>');
 $paragraph_end = strpos($blog_post, '</p>', $paragraph_start);
 $paragraph = substr($blog_post, $paragraph_start + strlen('<p>'), $paragraph_end - $paragraph_start - strlen('<p>'));

편집하다: 실제로 다른 사람의 답변에 있는 정규식은 더 쉽고 빠릅니다.질문에 대한 당신의 크고 복잡한 정규식은 나를 혼란스럽게 만들었습니다 ...

HTML 구문 분석에 정규식을 사용하는 것은 결코 올바른 해결책이 아닙니다.이 특별한 경우에는 XPATH를 사용해야 합니다.

$string = <<<XML
<a>
 <b>
  <c>texto</c>
  <c>cosas</c>
 </b>
 <d>
  <c>código</c>
 </d>
</a>
XML;

$xml = new SimpleXMLElement($string);

/* Busca <a><b><c> */
$resultado = $xml->xpath('//p[1]');
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top