1
4

5 回答 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('&','&amp;',$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 回答