【问题标题】:PHP: Extract ID from a href search by namePHP:按名称从href搜索中提取ID
【发布时间】:2018-04-23 19:18:53
【问题描述】:

是否可以使用 preg_match(或任何其他方式)从如下列表中获取 ID(在 # 之后)?

示例: 搜索:数据数据 Echo(其 ID):num0035586039

<a href="page1.html#num0035583725">name1</a>
<a href="page30.html#num0035584494">othername</a>
<a href="page55.html#num0035584859">word</a>
<a href="page132.html#num0035585496">wordname</a>
<a href="page133.html#num0035586039">datadata</a>
<a href="page203.html#num0035586647">fsdfasfas</a>

谢谢!

【问题讨论】:

    标签: php regex preg-match href extract


    【解决方案1】:
    <?php
    $dataArray=array('<a href="page1.html#num0035583725">name1</a>','<a href="page30.html#num0035584494">othername</a>');
    
    $data='';
    foreach($dataArray as $row){
        if (strpos($row, 'othername') !== false) {
            $whatIWant = substr($row, strpos($row, "#") + 1);
            $newData=substr($whatIWant, 0, strpos($whatIWant, '"'));
            echo $newData;
        }
    }
    

    您的输出就是您要查找的 id。

    编辑:我在数组中设置了 2 个链接,因此我的代码正在整个数组中查找,试图匹配您想要的值(名称 1)。当它找到它然后移动到 tirming。输出当然是 id。如果有 2 个或更多与您的搜索条件匹配的 href,它将打印它们的 id(因此不限于 1 个)。

    编辑:要获得与搜索匹配的整个链接,请访问:

     if (strpos($row, 'othername') !== false) {
            echo htmlspecialchars($row);
    //the rest of the code
    

    【讨论】:

    • 感谢您的帮助。但是,我怎样才能只得到 name1 所在的行?
    • 对不起。我在完成句子之前误按了输入。
    • 好的,所以要理解你的问题,那些hrefs你如何在你的php代码中得到它们?作为数组字段?作为字符串?我只是将其设置为普通字符串,以向您展示如何修剪它。
    • 这个词的搜索将在几个长页面上完成,这些页面带有我上面发布的链接。从提取单词的 ID 开始,我将从其他文件中进行其他提取。
    • 看看。我根据您的需要更新了我的代码以更加“动态”地工作。
    【解决方案2】:

    如上文link 所述

    <?php
    $url = 'http://username:password@hostname:9090/path?arg=value#anchor';
    
     function unparse_url($parsed_url) {
      $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
      return "$fragment";
    } 
    ?>
    

    会回来

    anchor
    

    【讨论】:

      【解决方案3】:

      快速和(非常)肮脏的答案:

      $data = '<a href="page1.html#num0035583725">name1</a>
      <a href="page30.html#num0035584494">othername</a>
      <a href="page55.html#num0035584859">word</a>
      <a href="page132.html#num0035585496">wordname</a>
      <a href="page133.html#num0035586039">datadata</a>
      <a href="page203.html#num0035586647">fsdfasfas</a>';
      
      preg_match_all("/#num(\d+)\">([^<]*)</", $data, $matches);
      $search = array_combine($matches[1], $matches[2]);
      print_r($search);
      

      结果:

      Array
      (
          [0035583725] => name1
          [0035584494] => othername
          [0035584859] => word
          [0035585496] => wordname
          [0035586039] => datadata
          [0035586647] => fsdfasfas
      )
      

      正则表达式扫描 #num 的出现次数,然后获取 "&gt;&lt; 之间的所有内容。

      我是否已经提到这很脏?正则表达式是解析 XML 的一种讨厌的方式。最好使用一些解析器。

      【讨论】:

      • 感谢您的帮助,@Matthijs。我也会试试你展示的。如果没有太多要求,您将如何使用解析器?
      【解决方案4】:

      我不会为此使用正则表达式。您可以使用 HTML 解析器获取准确的 HREF,然后使用 URL 解析器获取片段。

      $string = '<a href="page1.html#num0035583725">name1</a>
      <a href="page30.html#num0035584494">othername</a>
      <a href="page55.html#num0035584859">word</a>
      <a href="page132.html#num0035585496">wordname</a>
      <a href="page133.html#num0035586039">datadata</a>
      <a href="page203.html#num0035586647">fsdfasfas</a>';
      $doc = new DOMDocument('1.0', 'utf-8');
      libxml_use_internal_errors(true);
      $doc->LoadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
      $links = $doc->getElementsByTagName('a');
      foreach($links as $link){
          if(strpos($link->nodeValue, 'name1') !== FALSE) {
              $href = $link->getAttribute('href');
              $url_bits = parse_url($href);
              echo $url_bits['fragment'];
          }
      }
      

      演示:https://3v4l.org/DNdE5

      如果由于某种原因 URL 解析器无法正常工作,您可以在此处对 $href 使用正则表达式、explode 或 preg_split。正则表达式方法可能是:

      $string = '<a href="page1.html#num0035583725">name1</a>
      <a href="page30.html#num0035584494">othername</a>
      <a href="page55.html#num0035584859">word</a>
      <a href="page132.html#num0035585496">wordname</a>
      <a href="page133.html#num0035586039">datadata</a>
      <a href="page203.html#num0035586647">fsdfasfas</a>';
      $doc = new DOMDocument('1.0', 'utf-8');
      libxml_use_internal_errors(true);
      $doc->LoadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
      $links = $doc->getElementsByTagName('a');
      foreach($links as $link){
          if(strpos($link->nodeValue, 'name1') !== FALSE) {
              $href = $link->getAttribute('href');
              preg_match('/#\K.+/', $href, $fragment);
              echo $fragment[0];
          }
      }
      

      演示:https://3v4l.org/F5LND

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        • 2017-06-11
        • 1970-01-01
        • 2020-10-24
        • 2020-05-05
        相关资源
        最近更新 更多