2010-05-24 3 views
3

간단한 문제가 있습니다. (필자는 스마일 이미지로 문자 smilies를 대체해야합니다.) .. 정말 복잡하지는 않지만 지금은 smilie appereances 만 바꾸어야합니다. HTML 태그의 외부 짧은 examplae :.Smiley HTML 문자열의 CDATA 내에서 바꾸기

텍스트 :

Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside. 내가 대체 할

"/"이 웃는의 이미지와 ...

좋아, 그렇게하는 방법 최선의 방법은?

답변

0

나는 에 대해 잘 모르겠다. 방법으로, 내가 할 수있는 유일한 방법.

스마일 코드가 키이고 링크가 값인 배열을 만듭니다. str_replace를 사용하십시오. 키 배열 (스마일 코드)을 "바늘"로 전달하고 값의 배열을 "바꿉니다".

$smiley_array = array(":)" => "<a href...>", 
    ":(" => "<a href=....>"); 
$codes = array_keys($smiley_array); 
$links = array_values($smiley_array); 
$str = str_replace($codes, $links, $str); 

편집 : 예를 들어

,이 같은 있다고 가정이 경우 이것은 실수로 preg_replace와 정규 표현식에 사용을 고려해야 웃는 - 링크와 다른 인스턴스를 대체 할 수있다. 분명히 preg_replace 은 str_replace보다 느린입니다.

+0

죄송합니다, 지금까지 문제를 설명하지 않았을 수 있습니다 ... 문제는 ": /"을 이미지로 바꾸면 "http : //"의 ": /"도 일치 할 것입니다. michaelm

+0

regexes 사용을 고려하십시오 – nc3b

0

당신은 정규식, 또는 위의 여분의 실수 버전을 사용할 수 있습니다

$smiley_array = array(":)" => "<a href...>", 
    ":(" => "<a href=....>"); 
$codes = array_keys($smiley_array); 
$links = array_values($smiley_array); 
$str = str_replace("://", "%%QF%%", $str); 
$str = str_replace($codes, $links, $str); 
$str = str_replace("%%QF%%", "://", $str); 

사실, 가정 않는 str_replace 정렬 배열을 다음을 ... 이 작동합니다 :

$smiley_array = array("://" => "%%QF%%", ":)" => "<a href...>", 
    ":(" => "<a href=....>", "%%QF%%" => "://"); 
$codes = array_keys($smiley_array); 
$links = array_values($smiley_array); 
$str = str_replace($codes, $links, $str); 
0

가능한 과잉을 (증가 된 CPU /로드), 99.99999999 % 안전 :

<?php 
$n = new DOMDocument(); 
$n->loadHTML('<p>Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.</p>'); 
$x = new DOMXPath($n); 
$instances = $x->query('//text()[contains(.,\':/\')]');//or use '//*[child::text()]' for all textnodes 
foreach($instances as $node){ 
    if($node instanceof DOMText && preg_match_all('/:\//',$node->wholeText,$matches,PREG_OFFSET_CAPTURE|PREG_SET_ORDER)){ 
      foreach($matches[0] as $match){ 
        $newnode = $node->splitText($match[1]); 
        $newnode->replaceData(0,strlen($match[0]),''); 
        $img = $n->createElement('img'); 
        $img->setAttribute('src','smily.gif'); 
        $img = $newnode->parentNode->insertBefore($img,$newnode); 
        //var_dump($match); 
      } 
    } 
} 
var_dump($n->saveHTML()); 
?> 

현실적으로 당신은 사용자가 HTML을 편집하도록 허용하는 경우에 한 번만 저장하고, 한 번 저장하고, 많은 것을 보여주고 싶지는 않습니다. (예 : wysiwyg 또는 elsely, 'return'변형 (img to text)은 훨씬 더 가볍습니다. 서로 다른 smilies (하나의 몬스터 정규 표현식 또는 그것들을 읽기위한 하나의 작은 것들/strstr(), 그리고 src에 스마일을위한 배열 (예 : array (': /'=> 'frown.gif '))는 길 일 것입니다.

2

나는 슈퍼 스크립트를 만들려고하지는 않지만 그것에 대해 생각합니다 .... 웃음은 항상 공백으로 둘러싸여 있습니다. 그래서 str은':/'를 스마일리. "문장의 끝 부분에서 웃는 얼굴을 가장 많이 사용하는 부분은 무엇입니까?"라고 말할 수 있습니다. 잠깐만 생각해 볼 수도있는 왼쪽 또는 오른쪽의 한 칸 이상을 확인하십시오.

위 스크립트 사용 :

$smiley_array = array(
    ":) " => "<a href...>", 
    " :)" => "<a href...>", 
    ":/ " => "<a href...>", 
    " :/" => "<a href...>"); 
$codes = array_keys($smiley_array); 
$links = array_values($smiley_array); 
$str = str_replace($codes, $links, $str); 

모든 것을 두 번 입력 할 필요가없는 경우 하나의 스마일리 배열에서 배열을 생성 할 수 있습니다.

+1

코드를 사용해 보았습니다. 나에게 큰 도움이되었습니다. 정말 감사합니다. – devtut

1

왜 당신은 어쩌면이처럼 웃는 텍스트 주위에 일부 특수 문자를 사용하지 마십시오 : -/- 이것은 당신의 웃는 텍스트 로모그래퍼

1

사용 preg_replace이다 인식하는 독특하고 쉬운 어떤 종류의 것 lookbehind 단언. 예 :

 
$smileys = array(
    ':/' => '<img src="..." alt=":/">' 
); 
foreach ($smileys as $smile => $img) { 
    $text = preg_replace('@(?<!<[^<>]*)' . preg_quote($smile, '@') . '@', 
         $img, $text); 
} 

정규식은 꺾쇠 괄호 안에 들어있는 스마일 만 일치해야합니다. 가양 성이 많으면 느려질 수 있습니다.