php - 이미지 - javascript url 자동 링크



PHP에서 일반 텍스트 URL을 HTML 하이퍼 링크로 변환 (9)

MkVal의 대답은 작동하지만 이미 앵커 링크가있는 경우 텍스트가 이상한 형식으로 렌더링됩니다.

두 가지 경우 모두 나를 위해 작동하는 솔루션은 다음과 같습니다.

$s = preg_replace ( 
    "/(?<!a href=\")(?<!src=\")((http|ftp)+(s)?:\/\/[^<>\s]+)/i",
    "<a href=\"\\0\" target=\"blank\">\\0</a>",
    $s
);

사람들이 일반 텍스트 필드에서 하이퍼 링크를 제출할 수있는 간단한 주석 달기 시스템이 있습니다. 이 레코드를 데이터베이스와 웹 페이지에 다시 표시 할 때 PHP에서이 링크를 HTML 유형 앵커 링크로 변환하는 데 사용할 수있는 RegExp는 무엇입니까?

알고리즘이 다른 종류의 링크 인 http와 https로이를 수행하는 것을 원하지 않습니다.


가장 정격 된 답변은 나를 위해 일을하지 못했습니다. 링크가 올바르게 대체되지 않았습니다.

fifa.com/worldcup/matches/round255951/match=300186487/…

일부 Google 검색과 몇 가지 테스트를 마친 후 다음과 같은 결과를 얻었습니다.

public static function replaceLinks($s) {
    return preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.%-=#]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $s);
}

나는 정규 표현식의 전문가가 아니기 때문에 실제로 나를 혼란스럽게 만든다. :)

따라서이 솔루션에 대해 의견을 말하고 개선하십시오.


다음은 전자 메일, URL이 포함 된 텍스트 및 프로토콜이없는 URL 등 모든 텍스트 링크 서식을 지정하는 코드입니다.

public function formatLinksInText($text)
{
    //Catch all links with protocol      
    $reg = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}(\/\S*)?/'; 
    $formatText = preg_replace($reg, '<a href="$0" style="font-weight: normal;" target="_blank" title="$0">$0</a>', $formatText);

    //Catch all links without protocol
    $reg2 = '/(?<=\s|\A)([0-9a-zA-Z\-\.]+\.[a-zA-Z0-9\/]{2,})(?=\s|$|\,|\.)/';
    $formatText = preg_replace($reg2, '<a href="//$0" style="font-weight: normal;" target="_blank" title="$0">$0</a>', $formatText);

    //Catch all emails
    $emailRegex = '/(\S+\@\S+\.\S+)/';
    $formatText = preg_replace($emailRegex, '<a href="mailto:$1" style="font-weight: normal;" target="_blank" title="$1">$1</a>', $formatText);
    $formatText = nl2br($formatText);
    return $formatText;
}

작동하지 않는 URL에 주석을 달아주십시오. 나는 정규 표현식을 업데이트하려고 노력할 것이다.


맞다면 일반 텍스트를 http 링크로 바꾸는 것입니다. 내가 도움이 될 수 있다고 생각되는 것은 다음과 같습니다.

<?php

   $list = mysqli_query($con,"SELECT * FROM list WHERE name = 'table content'"); 
   while($row2 = mysqli_fetch_array($list)) {
echo "<a target='_blank' href='http://www." . $row2['content']. "'>" . $row2['content']. "</a>";

   }  
?>

음, Volomike의 대답은 훨씬 더 가깝습니다. 그리고 조금 더 밀어 붙이기 위해 하이퍼 링크 끝 부분의 마침표 를 무시하기 위해 내가 한 일이 여기에 있습니다. 나는 또한 URI 조각을 고려했다.

public static function makeClickableLinks($s) {
  return preg_replace('@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
}

이거 한번 해봐:

$s = preg_replace('/(?<!href="|">)(?<!src=\")((http|ftp)+(s)?:\/\/[^<>\s]+)/is', '<a href="\\1" target="_blank">\\1</a>', $s);

기존 링크를 건너 뜁니다 (이미 href가 있으면 href 내부에 href를 추가하지 않습니다). 그렇지 않으면 빈 목표가있는 href가 추가됩니다.


question2answer 에서 비롯된 함수를 사용하고 있는데 일반 텍스트와 일반 텍스트 링크도 html로 허용합니다.

// $html holds the string
$htmlunlinkeds = array_reverse(preg_split('|<[Aa]\s+[^>]+>.*</[Aa]\s*>|', $html, -1, PREG_SPLIT_OFFSET_CAPTURE)); // start from end so we substitute correctly
foreach ($htmlunlinkeds as $htmlunlinked)
{ // and that we don't detect links inside HTML, e.g. <img src="http://...">
    $thishtmluntaggeds = array_reverse(preg_split('/<[^>]*>/', $htmlunlinked[0], -1, PREG_SPLIT_OFFSET_CAPTURE)); // again, start from end
    foreach ($thishtmluntaggeds as $thishtmluntagged)
    {
        $innerhtml = $thishtmluntagged[0];
        if(is_numeric(strpos($innerhtml, '://'))) 
        { // quick test first
            $newhtml = qa_html_convert_urls($innerhtml, qa_opt('links_in_new_window'));
            $html = substr_replace($html, $newhtml, $htmlunlinked[1]+$thishtmluntagged[1], strlen($innerhtml));
        }
    }
}   
echo $html;

function qa_html_convert_urls($html, $newwindow = false)
/*
    Return $html with any URLs converted into links (with nofollow and in a new window if $newwindow).
    Closing parentheses/brackets are removed from the link if they don't have a matching opening one. This avoids creating
    incorrect URLs from (http://www.question2answer.org) but allow URLs such as http://www.wikipedia.org/Computers_(Software)
*/
{
    $uc = 'a-z\x{00a1}-\x{ffff}';
    $url_regex = '#\b((?:https?|ftp)://(?:[0-9'.$uc.'][0-9'.$uc.'-]*\.)+['.$uc.']{2,}(?::\d{2,5})?(?:/(?:[^\s<>]*[^\s<>\.])?)?)#iu';

    // get matches and their positions
    if (preg_match_all($url_regex, $html, $matches, PREG_OFFSET_CAPTURE)) {
        $brackets = array(
            ')' => '(',
            '}' => '{',
            ']' => '[',
        );

        // loop backwards so we substitute correctly
        for ($i = count($matches[1])-1; $i >= 0; $i--) {
            $match = $matches[1][$i];
            $text_url = $match[0];
            $removed = '';
            $lastch = substr($text_url, -1);

            // exclude bracket from link if no matching bracket
            while (array_key_exists($lastch, $brackets)) {
                $open_char = $brackets[$lastch];
                $num_open = substr_count($text_url, $open_char);
                $num_close = substr_count($text_url, $lastch);

                if ($num_close == $num_open + 1) {
                    $text_url = substr($text_url, 0, -1);
                    $removed = $lastch . $removed;
                    $lastch = substr($text_url, -1);
                }
                else
                    break;
            }

            $target = $newwindow ? ' target="_blank"' : '';
            $replace = '<a href="' . $text_url . '" rel="nofollow"' . $target . '>' . $text_url . '</a>' . $removed;
            $html = substr_replace($html, $replace, $match[1], strlen($match[0]));
        }
    }

    return $html;
}

대괄호와 다른 문자를 포함하는 링크를 허용하기 때문에 약간의 코드가 있지만 도움이 될 것입니다.


$string = 'example.com
www.example.com
http://example.com
https://example.com
http://www.example.com
https://www.example.com';

preg_match_all('#(\w*://|www\.)[a-z0-9]+(-+[a-z0-9]+)*(\.[a-z0-9]+(-+[a-z0-9]+)*)+(/([^\s()<>;]+\w)?/?)?#i', $string, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
foreach (array_reverse($matches) as $match) {
  $a = '<a href="'.(strpos($match[1][0], '/') ? '' : 'http://') . $match[0][0].'">' . $match[0][0] . '</a>';
  $string = substr_replace($string, $a, $match[0][1], strlen($match[0][0]));
}

echo $string;

결과:

example.com
<a href="http://www.example.com">www.example.com</a>
<a href="http://example.com">http://example.com</a>
<a href="https://example.com">https://example.com</a>
<a href="http://www.example.com">http://www.example.com</a>
<a href="https://www.example.com">https://www.example.com</a>

이 솔루션에서 내가 좋아하는 것은 http/https 없이 <a href="www.example.com"></a> 이 작동하지 않기 때문에 www.example.comhttp://www.example.com 변환한다는 것입니다. http/https 프로토콜은 yourdomain.com/www.example.com 가리 킵니다.


public static function makeClickableLinks($s) {
    return preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $s);
}




preg-replace