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'];
}
}
如果由于某种原因 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];
}
}
是否可以使用 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'];
}
}
如果由于某种原因 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];
}
}