2010-06-29 6 views
0

나는 일하는 데 사용 된 일부 키워드에 대해 html로 보이는 정규 표현식을 사용하지만, 지금은 실패하고 그 이유를 모르겠습니다. preg_replace_Callback 호출에find-and-replace-in-html 정규 표현식이 실패합니다.

$find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s'; 
$text = preg_replace_callback($find, 'replaceCallback', $text); 

function replaceCallback($match) { 
     if (is_array($match)) { 
      $htmlVersion = $match[1]; 
      $urlVersion = urlencode($htmlVersion); 
      return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion . '">' . $htmlVersion . '</a>'; 
     } 
     return $match; 
    } 

오류 메시지 점 (. 정규 표현식은 this thread에서 온) 다음과 같이 말한다 :

Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier 't' in /frontend.functions.php on line 43 
+3

HTML 그래서 정규 표현식 여기에 가장 좋은 도구가 될 수 없습니다 정규 언어가 아닙니다 :이 중첩 된 HTML 태그 <em>Test<em> 발견하면 그것은 두 번째 시도에서 최대 여행. –

+4

html을 구문 분석하기 위해 정규식을 사용하면 안됩니다. 여기를 참고하십시오 : http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Oded

+2

멈출 수 있습니까? – Gordon

답변

0

참고 :이 수정 프로그램을 제공하기 위해 하지입니다 정규식. HTML을 성공적으로 파싱 할 정규 표현식을 만드는 것이 얼마나 어려운지를 보여주기위한 것입니다. 잘 구조화 된 XHTML조차도 악몽처럼 어려울 수 있지만 제대로 구조화되지 않은 HTML은 정규 표현식을 사용하지 않아도됩니다.

HTML 구문 분석을 시도하기 위해 정규 표현식을 사용하는 것이 매우 바람직하지 않다는 것에 동의합니다. 다음 코드는 제공된 함수를 사용하여 간단한 HTML 태그를 구문 분석합니다.

$t['label'] = 'Test'; 
$text = '<p>Test</p>'; 

$find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s'; 
$text = preg_replace_callback($find, 'replaceCallback', $text); 

echo "Find: $find\n"; 
echo 'Quote: ' . preg_quote($t['label']) . "\n"; 
echo "Result: $text\n"; 

/* Returns: 

Find: /(?![^<]+>)(?<!\w)(Test)\b/s 
Quote: Test 
Result: <p><a class="tag" rel="tag-definition" title="Click to know more about Test" href="?tag=Test">Test</a></p> 

*/ 

$t['label'] = '<em>Test</em>'; 
$text = '<p>Test</p>'; 

$find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s'; 
$text = preg_replace_callback($find, 'replaceCallback', $text); 

echo "Find: $find\n"; 
echo 'Quote: ' . preg_quote($t['label']) . "\n"; 
echo "Result: $text\n"; 

/* Returns: 

Find: /(?![^<]+>)(?<!\w)(Test)\b/s 
Quote: Test 
Result: <p><a class="tag" rel="tag-definition" title="Click to know more about Test" href="?tag=Test">Test</a></p> 
Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier '\' in /test.php on line 25 
Find: /(?![^<]+>)(?<!\w)(\<em\>Test\</em\>)\b/s 
Quote: \<em\>Test\</em\> 

Result: 

*/ 

function replaceCallback($match) { 
    if (is_array($match)) { 
     $htmlVersion = $match[1]; 
     $urlVersion = urlencode($htmlVersion); 
     return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion . '">' . $htmlVersion . '</a>'; 
    } 
    return $match; 
} 
+0

그래, 내가 가지고있어, html 정규식에 대한 정규 충분히 아니예요 :) 하지만 그렇다면, 어떻게 HTML 콘텐츠에 하이퍼 링크로 단어를 대체 갈 것이라고? – pixeline

+0

@pixeline : :-) 그것을 망쳐서 죄송합니다 - 그것은 단지 모든 곳에서 많이 제기되는 질문 일뿐입니다. Regexes는 처음에는 좋은 생각처럼 보일 수 있지만 거의 작동하지 않습니다. 어쨌든 PHP에서는 [DOM 함수] (http://www.php.net/manual/en/book.dom.php)를 사용해 보셔야합니다. [PHP와 DOM을 사용한 PHPro 구문 분석 HTML] (http://www.phpro.org/examples/Parse-HTML-With-PHP-And-DOM.html) 자습서도 도움이 될 수 있습니다. – Mike

+1

@pixeline 당신과 같은 질문은 하루에 적어도 세 번 올 수 있습니다. HTML * 또는 이와 유사한 키워드의 * 속성을 바꾸거나 몇 페이지 뒤로 질문을 탐색하십시오. 원하는 키 lib는 DOM입니다. – Gordon

관련 문제