PHP:按名称从 href 搜索中提取 ID

PHP: Extract ID from a href search by name

是否可以使用 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
$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 links,所以我的代码在整个数组中查找,试图匹配您想要的值 (name1)。当它找到它时,它会继续进行 timming。输出当然是id。如果有 2 个或更多 href 符合您的搜索条件,它将打印它们的 ID(因此不限于 1 个)。

编辑:要获得与您的搜索相匹配的整个 link,只需前往:

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

如上文 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";
} 
?>

将return

anchor

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

$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 的出现,然后获取 ">< 之间的所有内容。

我说过这很脏吗?正则表达式是一种解析 XML 的讨厌方法。最好使用一些解析器。

我不会为此使用正则表达式。您可以使用 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 上使用正则表达式、爆炸或 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