2009-10-06 5 views
0

HTML의 미국 영어 단어를 영국 영어 단어로 바꾸려면 정규 표현식 (PHP로 작동)이 필요합니다. 따라서 색상은 색상, 미터는 미터로 바뀝니다. [나는 미터도 영국 영어 단어이지만, 우리가 사용하는 사본은 항상 장치를 측정하는 것이 아니라 거리 단위를 참조 할 것임을 알고 있습니다]. (필자는 실제 입력을 통제 할 수 없기 때문에이 존재할 수 있지만) 패턴은 다음과 같은 (약간 인위적인) 예제에서 정확하게 작동해야합니다 :이 정규식 패턴은 무엇이 필요합니까?

<span style="color:red">This is the color red</span> 

[HTML 태그의 색상을 대체하지 말아야하지만 교체해야합니다 그것은

]

<p>Tony Brammeter lives 2000 meters from his sister</p> 

가 [있지만 이름에 단어 미터를 교체해야합니다]

<p>Color: red</p> 

은 [단어를 교체해야합니다] 문장에서

예를 들어 그의 이름이 Tony Meter 인 경우 교체가 유용하지 않은 경우가 있습니다. 그러나 이러한 경우는 드물어서 드물게 발생합니다.

답변

5

Html/xml은 정규 표현식으로 처리하면 안됩니다. 은 실제로는 anything과 일치하지 않습니다. 나는 그 # 1과 자신의 예 # 3의 실패 상당히 확신이 제외

# Warning: untested code! 
function process($node, $replaceRules) { 
    foreach ($node->children as $childNode) { 
     if ($childNode instanceof DOMTextNode) { 
      $text = pre_replace(
       array_keys(replaceRules), 
       array_values($replaceRules), 
       $childNode->wholeText 
      ); 
      $node->replaceChild($childNode, new DOMTextNode($text)); 
     } else { 
      process($childNode, $replaceRules); 
     } 
    } 
} 
$replaceRules = array(
    '/\bcolor\b/i' => 'colour', 
    '/\bmeter\b/i' => 'metre', 
); 
$doc = new DOMDocument(); 
$doc->loadHtml($htmlString); 
process($doc, $replaceRules); 
$htmlString = $doc->saveHTML(); 
+0

차갑다. 이것은 잘 작동 한 것 같습니다. DOMText는 $ node-> replaceChild 등에서 인수를 교환하는 동안 DOMTextNode가 작동하지 않도록 코드를 약간 변경해야했지만 멋지게 작동하는 것으로 보입니다. 유일한 사소한 문제는 문자열에서이 작업을 수행하려고하고 새로운 DOMDocument를 사용하면 문자열을 HTML 및 body 태그로 묶인 doctype andf가있는 HTML 페이지로 변환합니다. 표준 str_replace 등을 사용하여 이것을 제거 할 수 있습니다 (또는, 그러나 처음부터 이들을 생성하지 않는 더 좋은 방법이 있습니까? – Apemantus

0

정규식을 명시 적으로 사용할 필요가 없습니다. str_replace 함수를 시도하거나 대소 문자를 구분하지 않아도되는 경우 str_ireplace 함수를 사용하십시오.

예 : 당신은 대신 문자열, 검색 할 모든 단어 배열을 전달할 수 있습니다

$str = "<p>Color: red</p>"; 
$new_str = str_ireplace ('%color%', 'colour', $str); 

.

+0

을;하지만 당신은 내장 dom extension를 사용하여 재귀 문자열을 처리 할 수 ​​있습니다 후자는 단어 경계 검사 (PCRE 기반 정규 표현식에서'\ bword \ b')가 필요하고 전자는 적어도 원시적 인 태그 검사를 필요로합니다. – Twisol

4

입력을 제어 할 수 없기 때문에 제대로 작동하려면 사전과 어쩌면 문법적 분석이 필요합니다. 순수한 정규식 솔루션은 실제로 이러한 종류의 데이터를 올바르게 처리 할 수는 없습니다.

그래서 저는 "color"와 "meter"뿐만 아니라 대체해야 할 단어 목록을 제시 할 것을 제안합니다. Wikipedia has some information on the topic.

1

정규식이 필요하지 않습니다. 정규 표현식은 본질적으로 무국적이며 'html 태그'와 '데이터'의 차이점을 알 수있는 상태 측정이 필요합니다.

str_replace과 같은 HTML 구문 분석기를 사용하고 싶거나, 더 나은 문법 사전을 사용하고 Lucero가 제안한대로 사용하십시오.

1

두 번째 문제는 더 쉽습니다. 단어 주변에 단어 경계가있을 때 대체하려면 - 그러면 Brammeter에서 미터를 바꾸지 않습니다.

첫 번째 문제는 훨씬 어렵습니다. HTML 엔터티 안의 단어를 바꿀 필요가 없습니다. < 자 사이의 문자는 없습니다. 따라서 일치 여부를 확인하기 위해 마지막으로 보았거나 아무것도 표시하지 말고 단지 <이 아니어야합니다. 이것은 어렵거나, lookahead/lookbehind assertions의 조합이 필요하거나 정규 표현식으로는 불가능합니다.

상태 시스템을 구현하는 스크립트가 여기에서 훨씬 효과적입니다.

관련 문제