2011-07-28 3 views
3

저는 비슷한 질문을하고 있습니다 만, 제 상황이 약간 다르기 때문에 새로운 질문을하는 것이 더 좋을 것이라고 생각했습니다. 나는 1 시간 동안 수색을 했어. 뭔가를 놓친 것 같아. 그걸 용서해 줘.외부 링크 검색 및 편집

문제 : 페이스 북과 비슷한 기능을 개발 중입니다. 사용자가 앵커 태그에 넣을 수없는 많은 링크가 포함될 수있는 텍스트 메시지를 게시 할 수 있으며, 다른 프로토콜 (http,

  1. )는 이러한 링크를 감지하고 아마 바로 페이스 북과 같은 (을 검색하려고 시도에 HTTPS는 ftp는, ....)

    나는이 필요합니다. 나는 이것이 jquery를위한 작업이라고 생각한다.

  2. 또한 외부 링크를 안정적으로 감지하여 mysite.com/external?url=thelink로 변경해야합니다. 어떤, 저는 믿습니다, PHP를 위해 해당 작업이다 (I 클라이언트 측 오른쪽에서 들어오는 입력을 믿을 수 없기 때문에?)

어쨌든, 앵커 태그에서 보장하지 않는 링크, 그렇지 않습니다 돔 파서를 사용하는 것이 매우 안정적으로 보입니까? 나는 웹에서 간단한 정규식을 발견 내가 (훨씬 더 많은 프로토콜을 추가하여)

$strText = preg_replace('/(http|ftp)+(s)?:(\/\/)((\w|\.)+)(\/)?(\S+)?/i', '<a href="\0">\4</a>', $strText); 

을 사용할 수있다 생각 (임 BTW 정규식 끔찍한) 수이 작업에 경험이 밖에 일부 전문가 올바른 방향으로 나를 가리 키시겠습니까?

답변

1

그래, 이건 분명히 당신이 서버 쪽에서하고 싶은 무언가이다. 첫째, HTML 마크 업을 포함하는 사용자 입력을 수락하는 경우 HTML Purifier과 같은 좋은 HTML 필터로 위생 처리해야합니다. (이것은 또한 더 복잡한 마크 업 구문 분석 할 자신의 입력을 쉽게 할 것이다.)

) (단일 preg_replace이다 내에서 행할 문해야하지만, 나는이 같은으로 분할 것 :

$hrefPattern = '/<a[^>]+?href="(.+?)".*?>/i'; 

$outLink = 'http://mysite.com/external?url='; 

$offset = 0; 
while(preg_match($hrefPattern, $text, $hrefMatches, PREG_OFFSET_CAPTURE, $offset)) 
{ 

    $hrefInner = $hrefMatches[1][0]; 
    $offset = $hrefMatches[1][1]; 
    echo $hrefInner . "\r\n"; 

    if(strpos($hrefInner, '://') !== false) 
    { 
     $externalUrl = $outLink . rawurlencode($hrefInner); 
     $text = str_replace($hrefInner, $externalUrl, $text); 
     $offset += strlen($externalUrl); 
    } 

} 

preg_match() documentation은 매우 잘 설명합니다. 우리는 기본적으로 각 <a ... href=""> 태그를 찾고, 내용을 잡고 (anything)://으로 시작하면 다시 포맷하고, 더 이상의 링크가 $text에 남아 있지 않을 때까지 반복합니다. 링크를 다시 포맷하는 경우 rawurlencode() 새 링크가 valid인지 확인하기 위해 긁어 낸 링크가 ​​필요합니다.

페이스 북이 링크 스 니펫을 위해 콘텐츠를 긁는 방식은 내가 생각하기에 훨씬 복잡하지만 그렇다. 문제의 링크를 긁는 PHP 페이지에 AJAX 요청을 보내고 싶다. 원하는 스 니펫을 생성합니다. 의 경우에는이 조금 더 복잡합니다. 페이지가 없거나 다른 페이지로 리디렉션되거나 유효하지 않은 태그 나 다른 문서 유형 등이 있으면 처리해야합니다.

희망 하시겠습니까?