我需要解析以下字符串:
function lookup($symbol)
{
// reject symbols that start with ^
if (preg_match("/^\^/", $symbol))
{
return false;
}
// reject symbols that contain commas
if (preg_match("/,/", $symbol))
{
return false;
}
// body of price history search
$sym = $symbol;
$yahooURL='https://finance.yahoo.com/quote/'.$sym.'/history?p='.$sym;
// get stock name
$data = file_get_contents($yahooURL);
$title = preg_match('/<title[^>]*>(.*?)<\/title>/ims', $data, $matches) ? $matches[1] : null;
$title = preg_replace('/[[a-zA-Z0-9\. \| ]* \| /','',$title);
$title = preg_replace('/ Stock \- Yahoo Finance/','',$title);
$name = $title;
// get price data - use simple_html_dom.php (added to /include)
$body=file_get_html($yahooURL);
$tables = $body->find('table');
$dom = new DOMDocument();
$elements[] = null;
$dom->loadHtml($tables[1]);
$x = new DOMXpath($dom);
$i = 0;
foreach($x->query('//td') as $td){
$elements[$i] = $td -> textContent." ";
$i++;
}
$open = floatval($elements[1]);
$high = floatval($elements[2]);
$low = floatval($elements[3]);
$close = floatval($elements[5]);
$vol = str_replace( ',', '', $elements[6]);
$vol = floatval($vol);
$date = date('Y-m-d');
$datestamp = strtotime($date);
$date = date('Y-m-d',$datestamp);
// return stock as an associative array
return [
"symbol" => $symbol,
"name" => $name,
"price" => $close,
"open" => $open,
"high" => $high,
"low" => $low,
"vol" => $vol,
"date" => $date
];
}
因为这些可以由我想提供的人在合理范围内输入,支持各种间距。
我已经达到以下正则表达式。
<!-- MOCK -->
<!--MOCK-->
<!-- MOCK:SENT;FAIL -->
<!--MOCK:SENT;SUCCESS-->
<!--MOCK:SENT; SUCCESS-->
<!--MOCK:SENT ; SUCCESS-->
<!--MOCK:SENT -->
<!-- MOCK:SENT-->
<!-- MOCK : SENT -->
<!-- MOCK: SENT -->
<!-- MOCK :SENT -->
这适用于除前两个之外的所有上述测试字符串。在前两种情况下,&#34;模式&#34;群体回来是空的,我不明白,因为我认为<!-- *(?<mode>.*?(?=[ \-:])).*: *(?<responses>.*?(?= *-->))
会收集所有角色,直到它出现在空格,破折号或冒号上。如果我将中间的?<mode>.*?(?=[ \-:])
更改为.*: *
,那么我将获得所有&#34;模式&#34;价值观,但我失去了所有的回应&#34;值。
我的测试代码是在.NET Fiddle(https://dotnetfiddle.net/HzIXch)中,但这是为了完整性。
.*:? *
答案 0 :(得分:1)
我认为这里不需要使用前瞻。我就是这样做的:
(?<mode>[A-Z]+)([ \-:]+(?<responses>[A-Z; ]+\b))?
https://dotnetfiddle.net/6xpkt1
关于发布的其他答案以及对您的问题的评论,我完全不同意。 \s
与文字空间不同。它包含所有空白字符,如果您只是期望空格,可能会让您遇到麻烦。