2010-07-24 3 views
0

정규식을 사용하여 웹 페이지의 단어간에 발생할 수있는 HTML 태그를 찾으려고합니다.PHP를 사용하여 단어 사이에서 정규식 일치를 사용하려고 시도했습니다.

예를 들어, 일치시킬 문장이 "이것은 단어입니다"라고 입력하면 "This is a <b>word</b>"과 일치하는 패턴을 만들어야합니다. 내가 정규식 패턴을 준비하기 위해 아래의 코드를 사용하여 시도했습니다

는 :

$pattern = "/".str_replace(" ", .{0,100}, $sentence)."/si";

.{0,100} 모든 공백을 대체하고 모든 문자와 일치하도록 s 수정을 사용합니다. 그러나, 나는 이것으로 바람직하지 않은 결과를 얻고있다.

미리 감사드립니다.

+0

는 기존의 HTML을 유지하는 것이 중요합니다 (즉, 당신이 일치하는 문자열을 대체하려는 경우)? 그렇지 않은 경우 HTML 태그를 제거한 다음 일치 항목을 실행할 수 있습니다. –

+1

패턴을 일치 시키려면 일치시킬 기준이 있어야합니다. 일치시키고 자하는 패턴을 어떻게 결정할 건가요? 기준은 무엇입니까? IE : 첫 4 단어 일치 ... 등. 그것 없이는 당신이 작동하는 패턴을 찾는데 도움이되지 않습니다. –

+0

어떻게 패턴을 생각해 낼지에 대한 긴 배경이 있습니다.하지만 긴 이야기를 짧게 줄이기 위해 "This is a word"라는 문자열이 있다고 가정 해 봅시다. 정규식을 사용하여 "** word" – Enthusiast

답변

0

정규식 검색을 수행하고 바꿀 때 ereg_replace() 또는 preg_replace() 함수를 사용해보십시오.

+0

ereg_replace가 감가 상각됩니다. preg_replace에 충실하는 것이 더 좋습니다. –

+2

도대체? 아무도 내게 ereg_replace가 가치가 있다고 말했습니다! ;) – TheDeadMedic

+1

@ TheDeadMedic, Sell Sell Sell! –

0

나는이 문제를 매우 신속하게 처리하므로 모든 엣지 케이스를 다루지는 못하지만 적어도 부분적으로 요구 사항과 일치한다고 생각합니다. 또한, 나는 PHP에서 그것을 시도하지 않았습니다.

<p>This is a <b><i>nice</i> sentence</b>.</p> <p>Here's another sentence.</p> 

그것은 단지 다음과 같은 그룹으로, 첫 문장 일치 :

  1. <b>
  2. b
  3. <i>nice</i> sentence
  4. 다음 예에서

    /[^\s>]+[\s]*(<([^>]+)>)(.*)(</\2>)[\s]*[^\s<]+/g 
    

  5. b
0

실제로 달성하려는 것은 무엇입니까? 정규식 으로 html 문서를 구문 분석하면이 최상의 해결책이 아닐 수 있습니다. 지금까지 설명한 내용에 XPath을 사용할 수 있습니다.
예. 텍스트 this is a word 포함 된 테이블의 모든 행 찾는 :

<?php 
$doc = new DOMDocument; 
$doc->loadhtml('<html><head><title>...</title></head><body> 
    <table> 
    <tr><td>1</td><td>lalala</td></tr> 
    <tr><td>2</td><td>this is a <b>word</b></td></tr> 
    <tr><td>3</td><td>lalala</td></tr> 
    <tr><td>4</td><td><b>And this is a</b> word, too</td></tr> 
    </table> 
</body></html>'); 

$xpath = new DOMXPath($doc); 
foreach($xpath->query('/html/body/table/tr[./td[contains(., "this is a word")]]') as $tr) { 
    foreach($tr->childNodes as $td) { 
    echo $td->nodeValue, ' '; 
    } 
    echo "\n"; 
} 

인쇄

2 this is a word 
4 And this is a word, too 
0

정규 표현식

%(<[^>]+?>)\s*?((?:\w+\s*)*)\s*?(</[^>]+?>)%im 

사이에 간단한 여러 단어 문구를 포함한 기본적인 단어를 사로 잡고 적절한 여는 태그와 닫는 태그 및 전체 일치, 시작 태그, 단어/구문 및 닫기 태그를 그룹화하여 각각 쉽게 액세스 할 수 있도록하십시오.

그래서 입력 내용을 HTML 소스 코드라고합니다. 그런 다음 PREG_SET_ORDER 플래그와 함께 preg_match_all을 실행하십시오. foreach()를 사용하여 루프를 반복하는 데 유용한 배열 배열을 반환합니다.

아래의이 함수에서 $ html은 검색 할 소스 페이지이고 $ matches는 결과가 채울 값으로 전달되는 빈 배열입니다.

<?php 
$html=' 
This is a <b>word</b>. 
This is not a word. 
This is a <span>three word phrase</span>. 
'; 

$regex ='%(<[^>]+?>)\s*?((?:\w+\s*)*)\s*?(</[^>]+?>)%im'; 

preg_match_all($regex, $html, $matches, PREG_SET_ORDER); 

foreach($matches as $val) { 
    //$val[0] will always be the entire match with the tags 
    echo "full match: " . $val[0] . "\n"; 

    //$val[1] will always be the opening tag 
    echo "opening tag: " . $val[1] . "\n"; 

    //$val[2] will always be the word or words, if separated by spaces 
    echo "word: " . $val[2] . "\n"; 

    //$val[3] will always be the closing tag 
    echo "closing tag: " . $val[3] . "\n\n"; 
} 
?> 

위 스크립트의 출력 :

full match: <b>word</b> 
opening tag: <b> 
word: word 
closing tag: </b> 

full match: <span>three word phrase</span> 
opening tag: <span> 
word: three word phrase 
closing tag: </span> 
+0

오, 좋아, 나는이 질문이 2 살이라는 것을 깨달았다. 나는 그런 멍청한 녀석이다. –

관련 문제