Используйте preg_match () и заменяйте для преобразования URL в тег привязки в тексте - PullRequest
0 голосов
/ 01 ноября 2018

В настоящее время у меня есть следующий код для добавления a href к отправленному пользователем тексту, где находится HTTPS://. Проблема в том, что это, очевидно, меняет все ссылки в тексте на одинаковые name/location. Как я могу сделать этот процесс отдельно для каждого экземпляра HTTPS:// в тексте?

//Example variables (usually from MySQL)
$moreOrig = "https://duckduckgo.com is better than https://google.com";
// The Regular Expression filter
$testUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

if (preg_match($testUrl, $moreOrig, $url)) {
//split into parts if user has a /something to clean url
    $parts = explode ("/", $url[0]);

    //glue
    list($first, $second, $third) = $parts;

    //output
    $shortUrl = implode ("/", array($third));

    $more = nl2br(preg_replace($testUrl, "<a href='" . $url[0] . "' rel = 'nofollow'>" . $shortUrl . "</a>", $moreOrig));
  }

Вывод, требуемый против фактического (предположим, что входная переменная = "https://duckduckgo.com? Q = Утка + Утка + Го лучше, чем https://google.com? Q = Утка + Утка + Го")

Desired:
<a href = "https://duckduckgo.com?q=Duck+Duck+Go">duckduckgo.com</a> is better than <a href = "https://google.com?q=Duck+Duck+Go">google.com.</a>
<br>
Actual:
<a href = "https://duckduckgo.com?q=Duck+Duck+Go">duckduckgo.com</a> is better than <a href = "https://google.com?q=Duck+Duck+Go">google.com.</a>

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вы можете сделать это легко с помощью preg_replace_callback.

<?php

//Example variables (usually from MySQL)
$string = "https://duckduckgo.com is better than https://google.com";

// The Regular Expression filter
$pattern = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

$result = preg_replace_callback($pattern, function($match) {
    $url = $match[0];
    return sprintf('<a href="%1$s">%1$s</a>', $url);
}, $string);

// Result:
// "<a href="https://duckduckgo.com">https://duckduckgo.com</a> is better than <a href="https://google.com">https://google.com</a>"
0 голосов
/ 01 ноября 2018

Вам не нужно использовать preg_match(), explode() и implode(). Просто используйте preg_replace(). Вам нужно использовать групповое совпадение для всего URL, чтобы заменить его на <a></a>

$testUrl = "@((https?|ftps?)://([\w\-.]+\.[a-zA-Z]{2,3})(/\S*)?)@";
$newStr = preg_replace($testUrl, "<a href='$1'>$3</a>", $moreOrig);

Результат проверки в демо

0 голосов
/ 01 ноября 2018
<?php declare(strict_types = 1);

$input = "
xxx
https://duckduckgo.com/url/foo
xxx
https://bing.com
xxx
https://google.com/
xxx
";

$result = preg_replace_callback(
    "@
        (?:http|ftp|https)://
        (?:
            (?P<domain>\S+?) (?:/\S+)|
            (?P<domain_only>\S+)
        )
    @sx",
    function($a){
        $link = "<a href='" . $a[0] . "'>";
        $link .= $a["domain"] !== "" ? $a["domain"] : $a["domain_only"];
        $link .= "</a>";
        return $link;
    },
    $input
);

echo $result;
...