PHP - 从用户站点输入中获取网站标题
PHP - Get Website Title From User Site Input
我正在尝试获取用户输入的网站标题。
文本输入:网站link,用户输入的文本通过AJAX发送到服务器。
用户可以输入任何内容:实际存在的 link,或者只是一个单词,或者像 'po392#*@8'
这样奇怪的东西
这是我的 PHP 脚本的 部分 :
// Make sure the url is on another host
if(substr($url, 0, 7) !== "http://" AND substr($url, 0, 8) !== "https://") {
$url = "http://".$url;
}
// Extra confirmation for security
if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED)) {
$urlIsValid = "1";
} else {
$urlIsValid = "0";
}
// Make sure there is a dot in the url
if (strpos($url, '.') !== false) {
$urlIsValid = "1";
} else {
$urlIsValid = "0";
}
// Retrieve title if no title is entered
if($title == "" AND $urlIsValid == "1") {
function get_http_response_code($theURL) {
$headers = get_headers($theURL);
if($headers) {
return substr($headers[0], 9, 3);
} else {
return 'error';
}
}
if(get_http_response_code($url) != "200") {
$urlIsValid = "0";
} else {
$file = file_get_contents($url);
$res = preg_match("/<title>(.*)<\/title>/siU", $file, $title_matches);
if($res === 1) {
$title = preg_replace('/\s+/', ' ', $title_matches[1]);
$title = trim($title);
$title = addslashes($title);
}
// If title is still empty, make title the url
if($title == "") {
$title = $url;
}
}
}
但是,此脚本中仍然出现错误。
如果现有 url 为“https://www.youtube.com/watch?v=eB1HfI-nIRg' is entered and when a non-existing page is entered as 'https://www.youtube.com/watch?v=NON-EXISTING”,它 可以 完美地工作,但是 不能工作 当用户输入类似 'twitter.com'(没有 http)或类似 'yikes'.
的内容时
我尝试了一切:cUrl、DomDocument...
问题是当输入无效的 link 时,ajax 调用永远不会完成(它一直在加载),而它应该 $urlIsValid = "0" 每当发生错误。
我希望有人能帮助你 - 非常感谢。
内森
你有一个相对简单的问题,但你的解决方案太复杂而且有错误。
这些是我在您的代码中发现的问题:
// Make sure the url is on another host
if(substr($url, 0, 7) !== "http://" AND substr($url, 0, 8) !== "https://") {
$url = "http://".$url;
}
您无法确保 可能 url 在另一台主机上(可能是 localhost
)。您应该删除此代码。
// Make sure there is a dot in the url
if (strpos($url, '.') !== false) {
$urlIsValid = "1";
} else {
$urlIsValid = "0";
}
这段代码覆盖了它上面的代码,您在其中验证字符串确实是有效的 URL
,因此将其删除。
附加函数get_http_response_code
的定义毫无意义。您只能使用 file_get_contents
获取远程页面的 HTML
并根据 false
检查它以检测错误。
此外,根据您的代码我得出结论,如果(上下文外部)变量 $title
为空,那么您将不会执行任何外部提取,所以为什么不先检查它呢?
总而言之,您的代码应如下所示:
if('' === $title && filter_var($url, FILTER_VALIDATE_URL))
{
//@ means we suppress warnings as we won't need them
//this could be done with error_reporting(0) or similar side-effect method
$html = getContentsFromUrl($url);
if(false !== $html && preg_match("/<title>(.*)<\/title>/siU", $file, $title_matches))
{
$title = preg_replace('/\s+/', ' ', $title_matches[1]);
$title = trim($title);
$title = addslashes($title);
}
// If title is still empty, make title the url
if($title == "") {
$title = $url;
}
}
function getContentsFromUrl($url)
{
//if not full/complete url
if(!preg_match('#^https?://#ims', $url))
{
$completeUrl = 'http://' . $url;
$result = @file_get_contents($completeUrl);
if(false !== $result)
{
return $result;
}
//we try with https://
$url = 'https://' . $url;
}
return @file_get_contents($url);
}
我正在尝试获取用户输入的网站标题。
文本输入:网站link,用户输入的文本通过AJAX发送到服务器。
用户可以输入任何内容:实际存在的 link,或者只是一个单词,或者像 'po392#*@8'
这样奇怪的东西
这是我的 PHP 脚本的 部分 :
// Make sure the url is on another host
if(substr($url, 0, 7) !== "http://" AND substr($url, 0, 8) !== "https://") {
$url = "http://".$url;
}
// Extra confirmation for security
if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED)) {
$urlIsValid = "1";
} else {
$urlIsValid = "0";
}
// Make sure there is a dot in the url
if (strpos($url, '.') !== false) {
$urlIsValid = "1";
} else {
$urlIsValid = "0";
}
// Retrieve title if no title is entered
if($title == "" AND $urlIsValid == "1") {
function get_http_response_code($theURL) {
$headers = get_headers($theURL);
if($headers) {
return substr($headers[0], 9, 3);
} else {
return 'error';
}
}
if(get_http_response_code($url) != "200") {
$urlIsValid = "0";
} else {
$file = file_get_contents($url);
$res = preg_match("/<title>(.*)<\/title>/siU", $file, $title_matches);
if($res === 1) {
$title = preg_replace('/\s+/', ' ', $title_matches[1]);
$title = trim($title);
$title = addslashes($title);
}
// If title is still empty, make title the url
if($title == "") {
$title = $url;
}
}
}
但是,此脚本中仍然出现错误。
如果现有 url 为“https://www.youtube.com/watch?v=eB1HfI-nIRg' is entered and when a non-existing page is entered as 'https://www.youtube.com/watch?v=NON-EXISTING”,它 可以 完美地工作,但是 不能工作 当用户输入类似 'twitter.com'(没有 http)或类似 'yikes'.
的内容时我尝试了一切:cUrl、DomDocument...
问题是当输入无效的 link 时,ajax 调用永远不会完成(它一直在加载),而它应该 $urlIsValid = "0" 每当发生错误。
我希望有人能帮助你 - 非常感谢。
内森
你有一个相对简单的问题,但你的解决方案太复杂而且有错误。
这些是我在您的代码中发现的问题:
// Make sure the url is on another host
if(substr($url, 0, 7) !== "http://" AND substr($url, 0, 8) !== "https://") {
$url = "http://".$url;
}
您无法确保 可能 url 在另一台主机上(可能是 localhost
)。您应该删除此代码。
// Make sure there is a dot in the url
if (strpos($url, '.') !== false) {
$urlIsValid = "1";
} else {
$urlIsValid = "0";
}
这段代码覆盖了它上面的代码,您在其中验证字符串确实是有效的 URL
,因此将其删除。
附加函数get_http_response_code
的定义毫无意义。您只能使用 file_get_contents
获取远程页面的 HTML
并根据 false
检查它以检测错误。
此外,根据您的代码我得出结论,如果(上下文外部)变量 $title
为空,那么您将不会执行任何外部提取,所以为什么不先检查它呢?
总而言之,您的代码应如下所示:
if('' === $title && filter_var($url, FILTER_VALIDATE_URL))
{
//@ means we suppress warnings as we won't need them
//this could be done with error_reporting(0) or similar side-effect method
$html = getContentsFromUrl($url);
if(false !== $html && preg_match("/<title>(.*)<\/title>/siU", $file, $title_matches))
{
$title = preg_replace('/\s+/', ' ', $title_matches[1]);
$title = trim($title);
$title = addslashes($title);
}
// If title is still empty, make title the url
if($title == "") {
$title = $url;
}
}
function getContentsFromUrl($url)
{
//if not full/complete url
if(!preg_match('#^https?://#ims', $url))
{
$completeUrl = 'http://' . $url;
$result = @file_get_contents($completeUrl);
if(false !== $result)
{
return $result;
}
//we try with https://
$url = 'https://' . $url;
}
return @file_get_contents($url);
}