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

时间:2017-11-10 14:20:29

标签: php regex preg-match href extract

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

实施例: 搜索:的 datadata 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>

谢谢!

4 个答案:

答案 0 :(得分:0)

<?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个链接,所以我的代码在整个数组中查找,试图匹配你想要的值(name1)。当它找到它然后继续tirmming。输出当然是id。如果有2个以上的hrefs符合您的搜索标准,它将打印它们的ID(因此它不限于1)。

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

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

答案 1 :(得分:0)

如上文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

答案 2 :(得分:0)

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

$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的一种讨厌方式。更好地使用一些解析器。

答案 3 :(得分:0)

我不会使用正则表达式。您可以使用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