2012-08-08 2 views
1

내가 드루팔의 해시 태그 모듈이 버그를 해결하기 위해 노력하고있어 : http://drupal.org/node/1718154PHP는 정규 표현식은 HTML 태그에 문자열과 일치하는

나는 접두어 내 텍스트의 모든 단어에 일치하는이 기능을 가지고있다 #tag 같은 "#": 는 일반적으로 더 내부 페이지의 링크와 같은 <a href="#reference">link</a>, 또는 무시에 내가 필요

function hashtags_get_tags($text) { 
    $tags_list = array(); 
    $pattern = "/#[0-9A-Za-z_]+/"; 
    preg_match_all($pattern, $text, $tags_list); 
    $result = implode(',', $tags_list[0]); 
    return $result; 
    } 

, HTML 태그 안에 표시 # 접두어 단어는 (그래서 덧붙일 <에 이어>).

어떻게하면 좋을까요?

+2

필수 경고 :

if(strpos($link->getAttribute('href'), '#') !== 0) { 

이 함수입니다 : regex를 사용하여 HTML과 일치 시키려고 할 때 문제가 발생합니다. 소량의 텍스트에 대한 제한된 HTML 집합에서 해시 태그를 일치시키기 위해 최악의 시나리오는 아마도 엉망진창으로 보이는 콘텐츠 일 것입니다. 그러나 HTML에 regex를 사용할 때 보안 문제가 발생하기 쉽습니다. 매우 조심하십시오. –

+0

누군가가 항상 [RegEx로 HTML 구문 분석하기] (http://stackoverflow.com/a/1732454/1421049)와 연결됩니다. –

+0

실제로, 나는 나의 요구 사항을 제한 할 수 있다고 생각한다. 대부분의 경우'hashtags '를''태그 안에 무시하고 싶다. – gerlos

답변

1

일치 (strip_tags 기능 사용)하기 때문에 태그를 먼저 벗길 수 있습니까? 당신은 단지 HTML 태그 안에 하지있는 해시 태그를 일치시킬 경우

function hashtags_get_tags($text) { 

    $text = strip_tags($text); 

    $tags_list = array(); 
    $pattern = "/#[0-9A-Za-z_]+/"; 
    preg_match_all($pattern, $text, $tags_list); 
    $result = implode(',', $tags_list[0]); 
    return $result; 
} 

정규 표현식

는 까다로운 일이 될 것입니다.

0

당신은 내가 PHP DOM를 사용하여이 기능을 만든 preg_replace

function hashtags_get_tags($text) { 
$tags_list = array(); 
$pattern = "/#[0-9A-Za-z_]+/"; 
$text=preg_replace("/<[^>]*>/","",$text); 
preg_match_all($pattern, $text, $tags_list); 
$result = implode(',', $tags_list[0]); 
return $result; 
} 
0

사용하여 손 전에 태그를 던질 수있다.

#이있는 모든 링크를 href에 반환합니다.

당신이 단지 내부 해시 태그를 제거이 줄을 바꾸려면이와

if(strpos($link->getAttribute('href'), '#') === false) { 

는 :

function no_hashtags($text) { 
    $doc = new DOMDocument(); 
    $doc->loadHTML($text); 
    $links = $doc->getElementsByTagName('a'); 
    $nohashes = array(); 
    foreach($links as $link) { 
     if(strpos($link->getAttribute('href'), '#') === false) { 
      $temp = new DOMDocument(); 
      $elem = $temp->importNode($link->cloneNode(true), true); 
      $temp->appendChild($elem); 
      $nohashes[] = $temp->saveHTML(); 
     } 
    } 
    // return $nohashes; 
    return implode('', $nohashes); 
    // return implode(',', $nohashes); 
}