php - 如何获得内在价值
我得到了需要使用 preg match all 提取超链接标签内的值的 html 内容。我尝试了以下但我没有得到任何数据。我包含了一个示例输入数据。你们能帮我修复这段代码并在 play.asp?ID=(例如:我想从 play.asp?ID= 12345获取这个值12345)前面打印所有
问问题
4078 次
5 回答
2
$str = '<A HREF="http://www.somesite.com/play.asp?ID=12345&Selected_ID=&PhaseID=123" class="space"><span id="Img_1"></span></A>';
preg_match_all( '/<\s*A[^>]HREF="(.*?)"\s?(.*?)>/i', $str, $match);
print_r( $match );
试试这个。
于 2013-04-17T09:45:51.067 回答
1
不!正则表达式是一种(不好的)文本处理方式。这不是文本,而是 HTML 源代码。处理它的工具称为 HTML 解析器。虽然 PHP 的 DOMDocument 也能够加载 HTML,但在极少数情况下它可能会出现故障。一个糟糕的正则表达式(你错误地认为还有其他的)会在页面中的几乎所有更改上出现故障。
于 2013-04-17T09:15:40.313 回答
0
您不应该使用正则表达式来解析 HTML。
这是DOMDocument的解决方案:
<?php
$input = '<A HREF="http://www.somesite.com/play.asp?ID=12345&Selected_ID=&PhaseID=123" class="space"><span id="Img_1"></span></A>';
// Clean "&" element in href
$cleanInput = str_replace('&','&',$input);
// Load HTML
$domDocument = new DOMDocument();
$domDocument->loadHTML($cleanInput);
// Retrieve <a /> tags
$aTags = $domDocument->getElementsByTagName('a');
foreach($aTags as $aTag)
{
$href = $aTagA->getAttribute('href');
$url = parse_url($href);
$vars = array();
parse_str($url['query'], $vars);
var_dump($vars);
}
?>
输出 :
array (size=3)
'ID' => string '12345' (length=5)
'Selected_ID' => string '' (length=0)
'PhaseID' => string '123' (length=3)
于 2013-04-17T09:43:44.283 回答
0
这应该达到预期的结果。它是 HTML 解析器和内容提取功能的组合:
function extractContents($string, $start, $end)
{
$pos = stripos($string, $start);
$str = substr($string, $pos);
$str_two = substr($str, strlen($start));
$second_pos = stripos($str_two, $end);
$str_three = substr($str_two, 0, $second_pos);
$extractedContents = trim($str_three);
return $extractedContents;
}
include('simple_html_dom.php');
$html = file_get_html('http://siteyouwantlinksfrom.com');
$links = $html->find('a');
foreach($links as $link)
{
$playIDs[] = extractContents($link->href, 'play.asp?ID=', '&');
}
print_r($playIDs);
你可以simple_html_dom.php
从这里下载
于 2013-04-17T09:40:25.270 回答
0
这还不够吗?
/<a href="(.*?)?"/I
编辑:
这似乎有效:
'/<a href="(.*?)\?/i'
于 2013-04-17T09:13:49.303 回答
我得到了需要使用 preg match all 提取超链接标签内的值的 html 内容。我尝试了以下但我没有得到任何数据。我包含了一个示例输入数据。你们能帮我修复这段代码并在 play.asp?ID=(例如:我想从 play.asp?ID= 12345获取这个值12345)前面打印所有
问问题
4078 次
5 回答
2
$str = '<A HREF="http://www.somesite.com/play.asp?ID=12345&Selected_ID=&PhaseID=123" class="space"><span id="Img_1"></span></A>';
preg_match_all( '/<\s*A[^>]HREF="(.*?)"\s?(.*?)>/i', $str, $match);
print_r( $match );
试试这个。
于 2013-04-17T09:45:51.067 回答
1
不!正则表达式是一种(不好的)文本处理方式。这不是文本,而是 HTML 源代码。处理它的工具称为 HTML 解析器。虽然 PHP 的 DOMDocument 也能够加载 HTML,但在极少数情况下它可能会出现故障。一个糟糕的正则表达式(你错误地认为还有其他的)会在页面中的几乎所有更改上出现故障。
于 2013-04-17T09:15:40.313 回答
0
您不应该使用正则表达式来解析 HTML。
这是DOMDocument的解决方案:
<?php
$input = '<A HREF="http://www.somesite.com/play.asp?ID=12345&Selected_ID=&PhaseID=123" class="space"><span id="Img_1"></span></A>';
// Clean "&" element in href
$cleanInput = str_replace('&','&',$input);
// Load HTML
$domDocument = new DOMDocument();
$domDocument->loadHTML($cleanInput);
// Retrieve <a /> tags
$aTags = $domDocument->getElementsByTagName('a');
foreach($aTags as $aTag)
{
$href = $aTagA->getAttribute('href');
$url = parse_url($href);
$vars = array();
parse_str($url['query'], $vars);
var_dump($vars);
}
?>
输出 :
array (size=3)
'ID' => string '12345' (length=5)
'Selected_ID' => string '' (length=0)
'PhaseID' => string '123' (length=3)
于 2013-04-17T09:43:44.283 回答
0
这应该达到预期的结果。它是 HTML 解析器和内容提取功能的组合:
function extractContents($string, $start, $end)
{
$pos = stripos($string, $start);
$str = substr($string, $pos);
$str_two = substr($str, strlen($start));
$second_pos = stripos($str_two, $end);
$str_three = substr($str_two, 0, $second_pos);
$extractedContents = trim($str_three);
return $extractedContents;
}
include('simple_html_dom.php');
$html = file_get_html('http://siteyouwantlinksfrom.com');
$links = $html->find('a');
foreach($links as $link)
{
$playIDs[] = extractContents($link->href, 'play.asp?ID=', '&');
}
print_r($playIDs);
你可以simple_html_dom.php
从这里下载
于 2013-04-17T09:40:25.270 回答
0
这还不够吗?
/<a href="(.*?)?"/I
编辑:
这似乎有效:
'/<a href="(.*?)\?/i'
于 2013-04-17T09:13:49.303 回答