2016-07-11 8 views
0

현재 사용자 정의 BBCode 스타일 파서를 사용하여 [b]와 같은 포럼 스타일 태그를 해당 HTML로 변환하는 로컬 그룹에 대한 간단한 내부 메시징 스크립트를 개발 중입니다.폭발 다수의 해시 태그

나는 또한 해시 태그 기능과 같은 트위터를 포함시켜 사용자가 텍스트에 해시 태그를 두 개 이상 입력 할 때까지 잘 작동하는 메시징 시스템 내에서 토론하고 태그를 달고 추적 할 수 있습니다.

일반적으로 사용자는 제출 양식에 텍스트를 입력해야합니다.

SQL을 사용하면 토론 추적 프로그램은 매번 TrackDiscussion ($ i)을 호출 할 때 마지막 20 개의 메시지와 루프를로드합니다. 기능. $ i 매개 변수는 텍스트/제출이 해시 태그를 확인하기 위해 제공되는 곳입니다.

<a href="http://example.com/tag/hashtag1">#hashtag1</a>, <a href="http://example.com/tag/hashtag2">#hashtag2</a> 

그것은 출력 :

<a href="http://example.com/tag/hashtag1,hashtag2">#hashtag1, #hashtag2</a> 

나는 지저분한 사과가 출력 대신 텍스트에서 하나 이상의 해시 태그를 발견 때까지

function TrackDiscussion($i,$str=1) { 
    $keywords=""; 
    preg_match_all('/#(\w+)/',$i,$matches); 
    $i = 0; 
    if($str){ 
     foreach($matches[1] as $match) { 
      $count=count($matches[1]); 
      $keywords .= "$match"; 
      $i++; 
      if ($count>$i) $keywords .= ", "; 
     } 
    } 
    else{ 
     foreach($matches[1] as $match) { 
      $keyword[]=$match; 
     } 
     $keywords=$keyword; 
    } 
    return $keywords; 
} 

이 모두가 잘 작동 코드,하지만 내가 바로 키워드를 분리 할 필요가 있다고 추측하는 것이 옳은가?

누구든지 내가 어디에 놓을 지에 대한 포인터를 줄 수 있다면, 나는 감사 할 가치가있다. 나는 몇 번에 걸쳐 그것을 반복 해 왔고, 나는 내 실수를 발견하지 못했다.

감사합니다.

+0

실제로 링크를 생성하는 코드는 아마도 문제의 하나입니다. – apokryfos

+0

둘러보기 해시 태그는 $ keywords에 문자열로 저장되며 문자열을 연결합니다. trackDiscussion()에서 문자열을 반환하지 않고 배열을 반환합니다. –

답변

2

이와 비슷한 기능이 있습니까?

function TrackDiscussion($input) { 
    return preg_replace("~\#(\w+)~i", '<a href="http://example.com/tag/$1">#$1</a>', $input); 
} 

echo TrackDiscussion('Lorum #Ipsum dolor sit amet, #consectetur adipiscing #elit.'); 

해시 태그 링크 만 포함되어 있습니까?

function TrackDiscussion2($input) { 
    preg_match_all("~\#(\w+)~i", $input, $matches); 
    $return = array(); 
    foreach($matches[1] as $match) { 
     $return[] .= '<a href="http://example.com/tag/'.$match.'">#'.$match.'</a>'; 
    } 
    return implode(', ', $return); 
} 

echo TrackDiscussion2('Lorum #Ipsum dolor sit amet, #consectetur adipiscing #elit.'); 
+0

도움을 주셔서 감사합니다. 이제 완벽하게 작동합니다. 나는 왜 간단한 대답이 나를 때로는 회피하는지 모른다. 답변으로 표시되었습니다. – AlbrightK

1

나는 가능한 한 단순하게하기 위해 논리를 분리 된 기능으로 나누었습니다. 이게 너 니가 보낸거야?

$last20Messages = array(
    'This is just some random stuff. #random #stuff', 
    'And some more. #some #more', 
); 
echo getTagLinksForMessages($last20Messages); 

출력 :

<a href='/tag/random'>#random</a> 
<a href='/tag/stuff'>#stuff</a> 
<a href='/tag/some'>#some</a> 
<a href='/tag/more'>#more</a> 

그리고 기능 정의 :

/** 
* @param string $message 
* @return array 
*/ 
function getTagsFromMessage($message) 
{ 
    preg_match_all('/#(\w+)/', $message, $matches); 
    return $matches[1]; 
} 

/** 
* @param array|string[] $messages 
* @return array 
*/ 
function getTagsFromMessages(array $messages) 
{ 
    $tags = []; 
    foreach ($messages as $message) { 
     $messageTags = getTagsFromMessage($message); 
     $tags = array_merge($tags, $messageTags); 
    } 
    $tags = array_unique($tags); 

    // You can then sort the tags here. E.g. alphabetical order. 
    return $tags; 
} 

/** 
* @param array $tags 
* @return string 
*/ 
function getTagLinksString(array $tags) 
{ 
    $result = ''; 
    foreach ($tags as $tag) { 
     $result .= "<a href='/tag/{$tag}'>#{$tag}</a>"; 
    } 
    return $result; 
} 

/** 
* @param array $messages 
* @return string 
*/ 
function getTagLinksForMessages(array $messages) 
{ 
    $tags = getTagsFromMessages($messages); 
    return getTagLinksString($tags); 
} 
+0

당신과 론 판 데르 하이든의 대답은 훌륭합니다. 그룹이 최종 버전에서 어떻게 행동하길 원하는지에 따라 Ron 's는 텍스트의 해시 태그를 강조하는 데 유용하며 주변에 여분의 텍스트가 없어도 작은 태그 목록이 필요한 경우 유용합니다. (론의 대답은 받아 들여지는 반면 나는 너의 업 포즈를 취할 것이다) – AlbrightK