【问题标题】:Reading source of another website with PHP and giving it to JavaScript as a string [closed]使用 PHP 读取另一个网站的源代码并将其作为字符串提供给 JavaScript [关闭]
【发布时间】:2016-08-27 12:19:27
【问题描述】:

我想将另一个网站的元描述读取为 JavaScript 中的字符串。我尝试使用 CORS,但收到错误消息“请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”

有人建议我可以使用 PHP 来执行此操作。我不懂 PHP,需要一些帮助。如何调用 PHP 函数来读取不同域上某些网页的源代码,然后将输出作为字符串提供给 JavaScript 函数?

【问题讨论】:

    标签: javascript php html cross-domain


    【解决方案1】:

    这是一种简单、直接的方式来帮助您获得想要的东西。首先尝试一下...将下面的整个代码粘贴到一个空的 PHP 文件上并运行它。在这个简单场景中不需要 Ajax。所以你有 2 个选项:

    选项 NR。 1

    <?php
        //SIMPLY CHANGE THE URL TO THE URL YOU DESIRE
        $siteURL        = "https://yahoo.com/";
        $siteContent    = file_get_contents($siteURL);
        $metaRx         = "#<meta .*description.*>$#m";
        preg_match($metaRx, $siteContent, $metaMatches);
        $metaString     = str_replace("'", "\'", $metaMatches[0]);
    
        //DUMP THE ARRAY OF MATCHES TO THE SCREEN... JUST TO EXPLORE THE RESULTS
        var_dump($metaMatches);
    ?>
    <script type="text/javascript">
        //EXPOSE THE META TO YOUR JAVASCRIPT USING A GLOBAL VARIABLE (FOR EXAMPLE).
        var SITE_META_DESC = '<?php echo $metaString; ?>';
        // DUMP VALUE TO THE SCREEN USING ALERT....
        alert(SITE_META_DESC);
    </script>
    

    这是另一种选择……它简洁明了;但是它可能不会给你想要的结果:

    选项 NR。 2

    <?php
        //SIMPLY CHANGE THE URL TO THE URL YOU DESIRE 
        $metaTags           = get_meta_tags('https://yahoo.com/');
        $metaDescription    = $metaTags["description"];
        var_dump($metaDescription);
    
        //USING A DATA-SOURCE ARRAY:
        $arrURLs            = array("http://sbb.ch", "http://alibabaexpress.com", "https://yahoo.com", "http://badoo.com" );
        $arrMetaDescs       = array();
    
        // LOOP THROUGH THE $arrURLs AND GET THE META
        // AND STORE THE RESULT IN AN ARRAY TOO.
        foreach($arrURLs as $url){
            //IF YOU WANT YOU COULD USE THE URL AS KEY FOR EASIER IDENTIFICATION
            try{
                $metaTags                   = get_meta_tags($url);
                if($metaTags){
                    $key                    = preg_replace("&(https:\/\/|http:\/\/|www\.|\/.*$)?&", "", $url);
                    $arrMetaDescs[$key]     = $metaTags["description"];
                }
            }catch(Exception $e){
    
            }
        }
        var_dump($arrMetaDescs);
    
    ?>
    <script type="text/javascript">
        //EXPOSE THE META TO YOUR JAVASCRIPT USING A GLOBAL VARIABLE (FOR EXAMPLE).
        var SITE_META_DESC = '<?php echo $metaDescription; ?>';
        alert(SITE_META_DESC);
    
    
        // IN THE CASE OF ARRAY-BASED META-EXTRACTION,
        // STORE THE META VALUES IN JSON FORMAT FOR JAVASCRIPT
        var ARR_META_DESC_EXTRACT = '<?php echo json_encode($arrMetaDescs); ?>';
        console.log(ARR_META_DESC_EXTRACT);
    </script>
    

    【讨论】:

    • 为什么不简单地使用get_meta_tags() 而不是下载整个源代码并让服务器cpu 使用正则表达式?
    • get_meta_tags 确实是这里的完美解决方案。然而,有些人抱怨这个功能对他们不起作用......我实际上会更新答案......不过感谢提醒...... ;-)
    • 它对某些人不起作用的原因是因为现在很多网站不再使用元描述标签。谷歌就是一个例子。 get_meta_tags() 但是完全按照它应该做的。不客气:)
    • 当然......你是对的......但你自己检查一下......尝试在你自己上面运行代码......第一个替代方案返回/警告@Chinmay Ratnaparkhi想要的.第二个(首选且简洁的)替代方案仅返回并提醒我的雅虎您(可能)知道原因吗?
    • 我真的不知道为什么会这样。特别是因为“我的雅虎”根本没有出现在任何源代码中。很奇怪。
    【解决方案2】:

    这显然是最简单的方法:

    <?php
    
    // Get Meta Tags from the given URL
    $tags = get_meta_tags('http://www.example.com');
    
    ?>
    
    <!DOCTYPE HTML>
    <html>
        <head>
            <script type="text/javascript">
    
            var urlMetaDesc = "<?php echo $tags['description']; ?>";
    
            alert(urlMetaDesc);
    
            </script>
        </head>
        <body>
        </body>
    </html>
    

    请记住,如果网站没有设置元描述标签,则不会返回任何内容,也不会显示任何警报。

    【讨论】:

    • 你能测试你的代码吗?只需将您的网址替换为 yahoo.com 您得到了什么?然后尝试查看源代码。您的 Result 和您在 Source-Code 中看到的内容是否一致?
    • 这对我来说效果很好,非常感谢!是否可以让 JavaScript 将 URL 提供给 PHP?我有一个要获取描述的 URL 列表,所以如果我可以循环遍历 URL 数组,那就太好了。
    • @ChinmayRatnaparkhi 是也不是。你看,PHP 在网站加载之前就完成了它的工作。 Javascript 在网站加载期间或之后执行其工作。因此,如果您真的希望 Javascript 将 URL 发送到 PHP 脚本,则必须重新加载网站,以便 PHP 能够对其进行处理。您可以使用 Ajax 来防止可见的网站重新加载。但是要让它工作,脚本会变得更加复杂。
    【解决方案3】:

    这是一种方法:

    1. 在您的服务器上设置一个页面source_getter.php,并包含以下代码(来自this answer):

    $html = file_get_contents('your_url_here'); echo $html;

    1. 如果您使用的是 jQuery,请运行如下请求:

    $.ajax({ url : 'source_getter.php', success : function (result) { doSomethingWithResult(result); // result will equal $html from your PHP code }, error : function () { alert("error"); } })

    我没有专门测试过这段代码,但它应该可以正常工作。

    【讨论】:

    • 您正在下载(并返回)网站的整个 html 源代码,而问题只要求提供元描述标签。这是对资源的不必要使用以及返回错误信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2013-11-05
    • 2016-09-23
    相关资源
    最近更新 更多