【问题标题】:extract URLs from href inside unordered lists and insert into mysql with PHP从无序列表中的href中提取URL并使用PHP插入mysql
【发布时间】:2023-03-17 02:27:01
【问题描述】:

我有几个无序列表。列表项是 URL。如何从每个列表项中提取 URL 和链接文本以插入数据库?

<ul id="1">
    <li><a href="someplace.com">Text</a></li>
    <li><a href="someplace.com">Text</a></li>
    <li><a href="someplace.com">Text</a></li>
</ul>

<ul id="2">
    <li><a href="someplace.com">Text</a></li>
    <li><a href="someplace.com">Text</a></li>
    <li><a href="someplace.com">Text</a></li>
</ul>

<ul id="3">
    <li><a href="someplace.com">Text</a></li>
    <li><a href="someplace.com">Text</a></li>
    <li><a href="someplace.com">Text</a></li>
</ul>

我知道应该避免使用 RegEx。我已经设置了 PDO。 ul id 编号进入 mysql 表上的 categoryID。

似乎唯一有意义的事情是类似于 while 循环,其中包含另一个循环来获取 URL 和文本,然后在增加 id 之后。我只是不知道如何开始。 URL 和文本是否应该放入一个数组中?

【问题讨论】:

  • 您是在页面加载后尝试插入它们,这也是动态内容吗?
  • 为什么要避免使用正则表达式?
  • 我怀疑你会想要使用 DOMDocument 或其他 PHP DOM 库。
  • 不。我只需要运行一次,就可以获取我插入的现有列表。
  • 我认为被问到的问题是您是否在将这些列表发送到浏览器之前拥有这些列表,或者您是否在将它们发送到浏览器之后尝试获取它们。

标签: php mysql string url


【解决方案1】:

假设您的 HTML 存储在字符串 $content 中,您可以使用 PHP DOM 来提取各种列表项,而无需使用正则表达式。

$dom = DOMDocument::loadHTML($content);
$lists = $dom->getElementsByTagName('ul');
foreach($lists as $list) {
  $id = $list->getAttribute('id');
  $links = $list->getElementsByTagName('a');
  foreach ($links as $link) {
    $href = $link->getAttribute('href');
    $text = $link->nodeValue;
    // insert $id, $text and $href into the data here 
  }
}

【讨论】:

    【解决方案2】:

    你可以使用正则表达式就好了:

    preg_match_all('/<a href=\"(.*?)\"[.*]?>(.*?)<\/a>/i', $string, $matches);
    
    $insert = array();
    
    foreach($matches as $val)
    {
        /* DONT FORGET TO ESCAPE YOUR DATA IF NEEDED */
        $url = $val[0];
        $name = $val[1];
    
        $insert[] = 'INSERT INTO tableName (url, name) VALUES ("' . $url . '", "' . $name . '")';
    }
    
    print_r($insert);
    

    【讨论】:

    • 正则表达式的唯一问题是很难选择要在一个大块中捕获的 URL。如果&lt;UL&gt; 标签之间存在 URL 怎么办?使用 DOM 可以应用一些更好的过滤逻辑和可读性,但可能会以一些速度为代价。
    • 上述正则表达式仅从href 属性中的&lt;a&gt; 标记中获取URL。它可以很容易地修改为在&lt;li&gt; 标签中查找&lt;a&gt; 标签,我猜它的偏好。
    • 关于为什么在使用正则表达式时会犹豫的问题从未得到解答。对于长期支持,它完全有用且可行。此外,如果这是一次性使用,那么使用 Perl 之类的东西会是一个更好的解决方案,因为它本身就广泛支持正则表达式功能。
    【解决方案3】:

    我推荐你试试SimpleHTMLDom,它是一个PHP 库,我用来处理类似xml 的文档。

    你可以很容易地这样做:

    require_once("/path/to/simplehtmldom/library");
    $parsed_data = array();
    //we next need to create a dom object --
    //case 1: let me assume the HTML is in a string
    $dom_object = str_get_html($html_string);
    //case 2: it's at a particular url
    $dom_object = file_get_html("http://www.site-with-the-content.com");
    //now we have our object
    $links = $dom_object->find("ul li a");
    //finds all the <a> tags on the page inside <ul>, you could filter it 
    //using class or ids like with jQuery if you like
    foreach($links as $link){
        $parsed_data[] = array(
            "link"=>$link->href,
            "text"=>$link->innertext
        );
    }
    //You can now go through your array of parsed content and insert into your DB    
    

    希望得到帮助:)

    SimpleHTMLDom Sourceforge project

    【讨论】:

      【解决方案4】:

      这里是jQuery 版本,用于提取您想要的值 如果您在将它们发送到浏览器后尝试获取它们

      var data=$("ul");
      var values=new Array();
      $.each(data,function(i){
      values[i]=$(this).attr("id");
      $.each($(this).find("li"),function(j){
      values[i+"-"+j+"link"]=$(this).find("a").attr("href")
      values[i+"-"+j+"text"]=$(this).find("a").text();
      });
      });
      console.log(values)
      

      现在通过 ajax 调用将此数组发送到您的 php 文件

      希望有意义

      【讨论】:

        猜你喜欢
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        • 2017-04-01
        • 2013-10-28
        相关资源
        最近更新 更多