2013-06-28 8 views
1

이 질문을 받았다면 미안하지만 실제로 작동하는 솔루션을 찾을 수 없습니다. 나는 게시판 시스템에서 일하고있다. 그리고 일을 끝냈다.하지만 나는 그것을 바보처럼 처리해야한다. 나는 현재 SQL과 같은 것을 망칠 모든 것을 제거하도록 설정했다. 그러나 strong, em, img, and a를 허용한다. 내 문제는 내가 잘 작동하지만, 태그를 사용하는 사람들은 때로는 그것을 사용하는 방법을 모르겠다, 그래서 대신 설명하는 텍스트를 표시하는 데, 그냥 PHP 나를 위해 그것을 해결하고 싶다는 것입니다. 따라서 사용자는 주소를 잘라내어 붙여 넣기를 한 다음 텍스트를 입력하고 필요한 경우 더 많은 주소를 가지고 양식을 제출할 수 있습니다. 그러면 하이퍼 링크가 작동되기를 원합니다. 지금은 태그를 사용하면 잘 작동하지만 태그를 사용하지 않으면 일반 텍스트가 튀어 나오게됩니다.MySQL 값에 텍스트가 하이퍼 링크로 변경되는 데 문제가있는 링크가 포함되어 있습니다. (내 제목이 엉망입니다.)

나는 모든 곳을 뒤적 거리며 아무 것도 작동하지 않습니다. 가장 많이 일어난 것은 게시물이 전혀 나타나지 않았다는 것입니다. 더 쉽게이 작업을 수행 할 수있는 다른 언어가 있다면 나는이 언어로 작업 할 의향이 있지만 지금은 PHP와 MySQL에 초점을 맞추고 있습니다. 필요하다면 코드를 기꺼이 게시 할 것이지만이 게시물을 실제로 도움이되지 않는 많은 데이터로 넘치고 싶지 않습니다. 난 단지 그것을 필요로 본문 데이터를 검색 링크가 링크로 그것을 발견하고 그것을 주위에 모든 것을 뱉어 찾으십시오.

위로를 피우기 위해, 나는 포함 폴더 안에있는 방법을 사용하고 있습니다. 각 일반 페이지에는 필요한 코드와 관련된 코드 만 있습니다. 따라서 forum.php는 실제로 디자인이 없지만 페이지마다 변경되지 않는 모든 디자인과 정적 컨텐츠가 포함 된 헤더 파일과 푸터 파일을 가져옵니다. 이제 read.php 파일은 includes 폴더에있는 모든 파일을 가져 와서 필요할 경우 적용합니다. 그래서 내가 사용한 코드 :

public static function url_to_link($text) { 
     // The Regular Expression filter 
     $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; 
     // Check if there is a url in the text 
     if (preg_match_all($reg_exUrl, $text, $url)) { 
      // make the urls hyper links    
      foreach($url[0] as $v){     
       //current position of the searached url 
       $curpos = strpos($text,' '.$v)+1; 
       //delete the url     
       $text = substr_replace($text,'', $curpos, strlen($v)); 
       //insert the link 
       $text = substr_replace($text,''.$v.'', $curpos ,0);     
      } 
      return $text; 
     } 
     else { 
      // if no urls in the text just return the text 
      return $text; 
     } 
    } 

그중 하나는 include/comment.php 파일에 있습니다. 거기에 thread_id를 가져 와서 read.php 페이지로 전달하고 스레드에 대한 응답을 보여주는 다른 함수가 있습니다. 이제 read.php 파일에이 코드를 가지고 :

user wrote: 
Thttp://www.example.com 

Testing links. 
June 28, 2013 at 03:09 PM 
____________________________ 
이이처럼 보이는 뭔가를 생산

<div id="comments"> 
<?php foreach($comments as $comment): ?> 
<div class="comment" style="margin-bottom: 2em;"> 
<div class="author"> 
<a href='profile.php?id=<?php echo $diuser[0] ?> '><?php echo htmlentities($comment->author) ?></a> wrote: 
</div> 
<div class="body"> 

<?php $comment_body = Comment::url_to_link($comment->body); 
    echo nl2br($comment_body); ?> 
</div> 
<div class="meta-info" style="font-size: 0.8em;"> 
<?php echo datetime_to_text($comment->posted); ?> 
</div> 
____________________________ 
</div> 

:

<div id="comments"> 
<?php foreach($comments as $comment): ?> 
<div class="comment" style="margin-bottom: 2em;"> 
<div class="author"> 
<a href='profile.php?id=<?php echo $diuser[0] ?> '><?php echo htmlentities($comment->author) ?></a> wrote: 
</div> 
<div class="body"> 
<?php echo strip_tags($comment->body, '<strong><em><p><a><img>'); ?> 
</div> 
<div class="meta-info" style="font-size: 0.8em;"> 
<?php echo datetime_to_text($comment->posted); ?> 
</div> 
____________________________ 
</div> 
<?php endforeach; 
if(empty($comments)) { echo "No comments."; } ?> 
</div> 

나는 그때 추가 된 새로운 함수를 호출하는 것을 변경

데이터

user wrote: 
Testing 

http://www.example.com 

Testing Links. 
Date (you get the idea) 
,536으로 보여주는되어야

코드가 뭔가를하고 있지만 데이터를 링크로 변경하지 않고 일부 데이터를 제거한 다음 함께 치기 만하면됩니다. 나는 잘못된 것을하고 있다는 것을 알고 있지만 그것을 이해할 수는 없다.

예 저는 htmlentities와 mysql_real_escape_string을 사용했습니다. 도와주세요.

testing http://stackoverflow.com testing links 

내가 출력 작업 링크를 원하지만 난 단지 표시하는 실제 링크를 원하는 :;

--EDIT--

TL 박사는 = 사용자가 포럼에 다음을 입력 링크로; 이 모양이 같아야합니다.

testing <a href="http://stackoverflow.com">http://stackoverflow.com</a> testing links 

그러나 발견 된 코드는 작동하지 않습니다.이 작업을 수행하려면 링크 입력을 추가해야합니까, 그렇게 할 수는 있지만, 사용자가 본문 입력의 URL을 입력하기 만하면 코드가 출력에서 ​​실제 링크로 변환됩니다. 현재 가지고있는 코드는 위와 같습니다. 다시 작동하지 않습니다.

+1

이와 비슷한 제품을 찾고 계십니까? http://regexr.com?35d3g –

+0

아니. 그거야. – DataCorrupt

답변

0

MySQL을보고있을 필요는 없습니다. 데이터베이스가 정상입니다.

는 당신이 볼 필요하면 태그로 둘러싸인 정규 표현식 및 링크에 대한 주석을 검색 할 수있는 다른 텍스트 분석 기능과 다음 출력 :

그것은 비교적 간단합니다. 그러나, 그것은 사소한 것이 아니고 실제적인 결과는 대부분의 웹 사이트가 BBCode를 사용하거나 간단한 구문을 발명한다는 것입니다 (StackOverflow가 링크를 감지하더라도) StackOverflow 및 Reddit은 모두 브래킷 서라운드 링크 조합을 사용합니다.

preg_replace 아마도 당신이 찾고있는 것을 수행합니다.

포함을 응축하기 위해 긴 과장되게 떠벌 리다를 다시 작성 해주세요 :

  • (HTML 문자로) 의도 된 출력

가에 대한 참조를 제거를 처리하는 실제 텍스트 데이터베이스. 이미 데이터베이스에서 데이터를 가져 왔으므로 정보의 출처는 이제 부적합합니다.

+0

이 말은 답글처럼 더 들립니다. –

+0

@DavidStarkey 게시물의 99 %는 관련성없는 와플입니다. "나는 몸의 데이터를 검색하여 링크를 찾아서 링크로 바꾸고 주위의 모든 것을 뿌리면된다." 나는 그 일을하는 방법에 대한 응답을했고, 더 나은 SO 질문을 작성하는 것에 대한 조언을 주었다고 생각합니다. 대조적으로, 당신의 코멘트는 나에게 응답 같이 소리가 난다! –

+0

어쩌면 대답 일 수도 있지만 지적하신 것처럼 질문은 너무 길어서 TL, DR이 있습니다. 개인적인 정책에 따라 전체 질문을 읽지 않으면 대답을 게시하지 않지만 의견은 항상 도움이됩니다. 질문에 대답하는 데 도움이된다고 생각하면 Regex 바이올린을 사용해보십시오. –

0

이전에 어떤 도움도 얻지 못했기 때문에 다른 사람들이이 방법을 알 수 있도록이 내용을 업데이트하려고했습니다.

먼저 PHP OO 방법을 사용하고 있습니다.

예 :

기능은 makeLinks 명령을 필요로하고 그 같을 것이다 다른 파일 내에서 호출 될 수
Comment.php // has the makeLinks code 

public static function makeLinks($str) {  
    return preg_replace('/(https?):\/\/([A-Za-z0-9\._\-\/\?=&;%,]+)/i', '<a href="$1://$2" target="_blank">$1://$2</a>', $str); 
} 

:

$comment_body = Comment::makeLinks(strip_tags($comment->body, '<strong><em><p><a><img>')); 
    echo nl2br($comment_body); 

난 그 말이 누군가가 수 있기를 바랍니다 유용하다고 생각해.