从字符串,正则表达式中提取变量?

时间:2011-11-20 23:02:20

标签: regex string variables screen-scraping preg-match

我的谜题:作为PHP newby,我试图使用正则表达式从字符串中提取一些数据,但我找不到正确的语法。

字符串的内容被删除为来自网站的几个图像的html,我希望最终输出为3个单独的变量:“$ Number1”,“$ Number2”和“$ Status”。

输入字符串$ html:

的内容示例
<div id="system">         
<img alt="2" height="35" src="/images/numbers/2.jpg" width="18" /><img alt="2" height="35" src="/images/numbers/2.jpg" width="18" /><img alt=".5" height="35" src="/images/numbers/point5.jpg" style="margin-left: -4px" width="26" /><img alt="system statusA" height="35" src="/images/numbers/statusA.jpg" width="37" /><img alt="2" height="35" src="/images/numbers/2.jpg" width="18" /><img alt="1" height="35" src="/images/numbers/1.jpg" width="18" /><img alt=".0" height="35" src="/images/numbers/point0.jpg" style="margin-left: -4px" width="26" />
</div>

此字符串中可能出现的值为:

  • 0.jpg
  • 1.JPG
  • 2.JPG
  • 3.JPG
  • 4.JPG
  • 5.JPG
  • 6.JPG
  • 7.JPG
  • 8.JPG
  • 9.jpg
  • point0.jpg
  • point5.jpg
  • statusA.jpg
  • statusB.jpg
  • statusC.jpg
  • statusD.jpg
  • statusE.jpg
  • statusF.jpg

结果应该是变量:

  • “Number1”(XX.X)基于前两个数字(0-9)和.0或.5
  • “状态”(statusX)基于状态
  • “Number2”(XX.X)基于最后两个数字(0-9)和.0或.5
到目前为止

代码:

$regex = '\balt='(.*?)';
preg_match($regex,$html,$match);
var_dump($match);
echo $match[0];

可能我必须分多步执行此操作或使用其他功能,谁可以帮助我?

3 个答案:

答案 0 :(得分:0)

你应该问自己的第一件事是:“我的输入数据采用何种格式”。因为在这种情况下它显然是HTML的片段,所以您应该将该片段提供给HTML解析器,而不是正则表达式引擎。

我不知道确切的函数名称,但您的代码应如下所示:

$htmltext = '<div id="system">[...]</div>';
$htmltree = htmlparser_parse($htmltext);
$images = $htmltree->find_all('img');
foreach ($images as $image) {
  echo $image->src;
}

因此,您需要找到一个将字符串解析为节点树的HTML解析器。节点应该具有基于CSS类,元素名称或节点ID在其中查找节点的方法。对于Python,这个库名为 BeautifulSoup ,对于Java,它是 JSoup ,我确信PHP有类似的东西。

simplehtmldom提供的示例看起来很有希望。

答案 1 :(得分:0)

答案 2 :(得分:0)

你想要的只是alt?试试这个xpath示例:

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DomXpath($doc);

foreach($xpath->query('//img/@alt') as $node){
    echo $node->nodeValue."\n";
}