Php 确定用户输入包含URL

Php 确定用户输入包含URL,php,javascript,jquery,Php,Javascript,Jquery,我有一个输入表单字段,它收集混合字符串 确定发布的字符串是否包含URL(如link.com、www.link.com等),以便根据需要正确定位该字符串。 这方面的一个例子是微博功能,其中处理脚本将通过链接锚定任何内容。其他样本可以是相同的帖子,其中http://link.com“自动锚定 我认为我应该通过展示而不是输入来实现这一点。我该怎么办呢?您可以使用$\u SERVER['HTTP\u HOST']获取主机信息 <?php $host = $SERVER['HTTP_HOST'];

我有一个输入表单字段,它收集混合字符串

确定发布的字符串是否包含URL(如link.com、www.link.com等),以便根据需要正确定位该字符串。

这方面的一个例子是微博功能,其中处理脚本将通过链接锚定任何内容。其他样本可以是相同的帖子,其中http://link.com“自动锚定


我认为我应该通过展示而不是输入来实现这一点。我该怎么办呢?

您可以使用
$\u SERVER['HTTP\u HOST']
获取主机信息

<?php

$host = $SERVER['HTTP_HOST'];

 ?>


  <a href ="<?= $host ?>/post.html">Post</a>

您希望精确到什么程度?考虑到URL的多样性,您必须在某个地方划定界限。比如说
www.ca
是一个完全有效的主机名,它确实提供了一个站点,但这并不是您所期望的工作。

您应该对此进行调查

您将构建一个模式,该模式将匹配字符串中看起来像URL的部分,并对其进行适当的格式化

它会出现类似这样的东西(举起这个,还没有测试过它)


$url\u matches将包含输入字符串中与url模式匹配的所有部分的数组。

在PHP中,您可以使用正则表达式对每个匹配调用函数。例如,您可以使用如下内容:

<?php

function makeLink($match) {
    // Parse link.
     $substr = substr($match, 0, 6);
     if ($substr != 'http:/' && $substr != 'https:' && $substr != 'ftp://' && $substr != 'news:/' && $substr != 'file:/') {
        $url = 'http://' . $match;
     } else {
        $url = $match;
     }

     return '<a href="' . $url . '">' . $match . '</a>';
}
function makeHyperlinks($text) {
    // Find links and call the makeLink() function on them.
    return preg_replace('/((www\.|(http|https|ftp|news|file)+\:\/\/)[_.a-z0-9-]+\.[a-z0-9\/_:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])/e', "makeLink('$1')", $text);
}

?>

您需要使用正则表达式来匹配常见的URL模式。PHP提供了一个名为的函数,允许您执行此操作

正则表达式本身可以有多种形式,但这里有一些东西可以让您开始使用(也可能只是谷歌的“URL正则表达式”:

“/^((http | https | ftp):/)?([[a-zA-Z0-9]-.])+([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]/+=%&.~-])$/”

因此,您的代码应该如下所示:

$matches  = array(); // will hold the results of the regular expression match
$string   = "http://www.astringwithaurl.com";
$regexUrl = '/^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$/';

preg_match($regexUrl, $string, $matches);

print_r($matches); // an array of matched patterns

从这里开始,您只需将这些URL模式包装在anchor/href标记中,就完成了。

这对OP有什么帮助?他想将任意用户提供的URL链接到文本字段中。帖子被标记为PHP,因此我假设他使用的是PHP。是的,这很好。这是PHP。但他自己的服务器名称对于识别其他主机名是无用的/用户提供的数据中的URL。我不同意。;)将
preg_replace()
与函数结合使用更容易,因为您不必再担心匹配的位置。而且,它是为它而做的…公平点。我想我是在假设,因为输入字符串未知,所以我们可能要处理多个URL进行匹配。在一个数组中回退这些匹配似乎更容易处理大的输入,让我们在处理匹配时有一些选择。没错,如果将所有匹配放在一个数组中,您确实有更多的选择。但是
preg\u replace()
较短,并且它还支持多个匹配,如
preg\u match()
。包含类似内容的字符串,只有部分链接是href“”。在这种情况下,只有一个包装器href,其余的保持在外部。
$matches  = array(); // will hold the results of the regular expression match
$string   = "http://www.astringwithaurl.com";
$regexUrl = '/^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$/';

preg_match($regexUrl, $string, $matches);

print_r($matches); // an array of matched patterns