从HTML注释标记中提取name = value内容

时间:2011-12-02 19:36:50

标签: php codeigniter

我正在尝试从PHP / Codeigniter中的一些Craigslist标记中获取内容。我需要解析的标签如下:

<!-- CLTAG xstreet0=Inman -->
<!-- CLTAG xstreet1=Moscrop -->
<!-- CLTAG city=Burnaby -->
<!-- CLTAG region=BC -->

对于包含在$ content变量中的每个标记,我想抓住每个名称/值对。可悲的是,我是正则表达式的SUCK,但到目前为止,这至少找到了其中一个标签的开头字符串:

$pattern = '/<!-- CLTAG city=/';
preg_match($pattern, $content, $matches);
echo "<pre>";
print_r($matches);
echo "</pre>";

我现在被卡住的地方现在要取出一对名字/值,这样我就可以使用'city'和'burnaby'了。同样适用于其他每个人。我怀疑这里还有什么东西?

2 个答案:

答案 0 :(得分:1)

$pattern = '/<!-- CLTAG ([^=]+)=([^\s]+) -->/';

preg_match($pattern, $content, $matches);

$ matches [1]应该等于你的属性,$ matches [2]应该等于你的值。

我根据您提供的数据猜测过滤器,可能需要进行调整。

答案 1 :(得分:1)

您可以通过添加“PREG_SET_ORDER”常量和preg_match_all()代替preg_match()来使您的生活更轻松:

$content = "
<!-- CLTAG xstreet0=Inman -->
<!-- CLTAG xstreet1=Moscrop -->
<!-- CLTAG city=Burnaby -->
<!-- CLTAG region=BC -->
";

$pattern = '/<!--\sCLTAG\s([^=]+)=([^\s]+)\s-->/';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
  echo 'key: ' . $match[1] . ' | value: ' . $match[2] . "\n";
}

如果您遇到没有指定“xstreet1”值的情况(因为地址可以这样工作),您需要稍微修改正则表达式模式并添加一个检查以确保循环中存在第二个组:

$pattern = '/<!--\sCLTAG\s([^=]+)=([^\s]+)?\s-->/';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
  echo 'key: ' . $match[1] . ' | value: ';
  echo empty($match[2]) ? 'N/A' : $match[2];
  echo "\n";
}

注意有一个'?'在正则表达式中的第二个捕获组之后添加。这告诉正则表达式编译器该组可能发生也可能不发生。