2012-02-23 3 views
0

일반 텍스트를 URL로 변환 할 때 약간의 문제가 있습니다. 나는이 같은 텍스트가 있다면 내가 갖고 싶은 무엇 이 있습니다 : www.google.com, 그것은링크를 텍스트로 변환 - php regex issue

<a href="www.google.com" target="_blank">www.google.com</a> 

내가 정규식 멍청한 놈의 종류 해요로 변환,하지만이 시도 것 :

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $description); 

설명 var은 변환되지 않은 URL을 포함 할 수있는 텍스트 조각입니다. 위의 코드와

, 내가 링크로이 얻을 :
<a target="_blank">www.google.com</a> 

는 그래서 HREF 부분이 밖으로 남아 있습니다. 이것은 RegEx 마법사를위한 케이크 조각 일 것입니다. 그래서 모든 도움을 미리 감사드립니다.

평범한 텍스트를 URL로 변환하는 또 다른 방법이 있다면, 그렇게 말할 수 있습니다. 시도해 보겠습니다.

+0

코드 실행을 시도했지만 완벽하게 작동합니다. 어떤 PHP 버전을 사용하고 있습니까? – Roberto

+0

PHP 버전 5.2.17 – samn

+1

'$ description'에 대한 예제 값을 게시 할 수 있습니까? – Roberto

답변

0

해결책을 찾았습니다. RegEx와는 아무 상관이 없었습니다. 내 동료는 머리에 jQuery 코드의 라인을 추가 :

$("a").removeAttr('href'); 

그래서 분명히 href 속성이 제거되고 있었다. 나는 이것이 PHP/정규 표현식 문제라고 확신했기 때문에 이것을 보지 않았다. 이 문제를 해결하면 문제가 해결됩니다.

나는 이것이 어리석은 오류라는 것을 깨닫고 이것을 해결하는 것이 불가능하므로 모두 도와 주셔서 감사합니다.

1

<a href="www.example.com">www.example.com</a>은 href 값이 현재 페이지 URL에 추가되기 때문에 최신 브라우저에서는 올바르게 작동하지 않습니다. http://example.com/www.example.com. 프로토콜을 지정해야합니다 (예 : HTTP/HTTPS 등

FTP, HTTP, HTTPS로 시작하는 모든 텍스트 "링크"를 대체하고있는 경우에만 태그를 HTML로

hello <a href="http://example.com">http://example.com</a> 
<a href="https://graph.facebook.com">https://graph.facebook.com</a> 
<a href="http://www.example.com">http://www.example.com</a> 
<a href="http://www.google.com">www.google.com</a> 
+0

하지만 텍스트가 www.google.com 인 경우 어떻게 되나요? ? – samn

+0

위의 코드를 편집하여 www urls도 처리 할 수 ​​있습니다 (href 속성에 http : //를 추가 함). 그러나 이제는 오 탐지를 할 수 있습니다. (테스트하지 않았습니다) – scibuff

2

<?php 

    $pattern = '/(www|ftp|http|https|file)(:\/\/)?[\S]+(\b|$)/i'; 
    $string = 'hello http://example.com https://graph.facebook.com http://www.example.com www.google.com'; 

    function create_a_tags($matches){ 

     $url = $matches[0]; 
     if ('www' == $matches[1]){ 
      $url = 'http://' . $matches[0]; 
     } 
     $escaped = htmlspecialchars($matches[0]); 
     return sprintf('<a href="%s">%s</a>', $url, $escaped); 
    } 

    echo preg_replace_callback($pattern, 'create_a_tags', $string); 

?> 

인쇄를 제출합니다 다음 문제는 링크가 http://www.google.com과 같이 정규화 된 URL 대신 www.google.com을 잘못 가리킨다는 것입니다. 올바른 교체는 다음과 같습니다.

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="http://$1" target="_blank">$1</a>', $description); 
0

얼마전에 우리는 URL 확인 및 식별에 대한 다양한 접근 방식을 비교했습니다. 정규 표현식의 table을 참조하십시오.

대신 정규식을 삭제하고 gruber revised을 사용하는 것이 좋습니다. A (PHP 5.3) 솔루션은 다음과 같을 수 있습니다.

<?php 

$string = 'hello 
http://example.com 
https://graph.facebook.com 
http://www.example.com 
www.google.com 
ftp://example.com'; 

$string = preg_replace_callback('#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))#iS', function($m) { 
    // use http as default protocol, if none given 
    if (strpos($m[0], '://') === false) { 
     $m[0] = 'http://' . $m[0]; 
    } 
    // text -> html is a context switch, take care of special characters 
    $_m = htmlspecialchars($m[0]); 
    return '<a href="' . $_m . '" target="_blank">' . $_m . '</a>'; 
}, $string); 

echo $string, "\n"; 
+0

근본적으로 잘못된 것은 없습니다. 그가 현재 사용하고있는 정규 표현식과 함께 - 생성 된 마크 업이 유효하지 않은 것으로 보입니다 (href의 스키마가 아닙니다) – AD7six

+0

정규 표현식에 문제가 있다고 말한 적은 없습니다. 방금 더 나은 점이 있다고 설명했습니다. 또한이 솔루션은 HTML에서 사용하기 위해 URL을 살균하는 유일한 솔루션입니다. 제가 생각하기에 언급해야 할 중요한 점이 있습니다. 더 큰 그림을 보지 않고 핵심 질문에 답하는 것에 만 관심이 있다면 - 내 손님이되고 원하는 모든 것을 downvote ... – rodneyrehm

+0

구문 분석 오류 : 예기치 않은 T_CONSTANT_ENCAPSED_STRING ($ string에 대해) = preg_replace_callback ('# (? i) \ b (? : [az] [\ w -] + :(? : 1,3) | [az ...] – samn