【问题标题】:PHP5 Parsing string help for (part) noob(部分)菜鸟的PHP5解析字符串帮助
【发布时间】:2012-12-21 19:51:57
【问题描述】:

我在 html 页面上有一个独特的项目。我已经能够解析大部分项目,因为它们没有使用组合处理来解析一个项目。

我有一个棘手的项目要解析:
- 它是一个列表项,在 DIV 内,是唯一的 (ld_sec_col)
- UL 类不是唯一的 (ld_details_list)
- 它不是一个特定的列表项编号(例如,不是第 3 或第 4 个)总是在变化
- 它是在唯一文本之后找到的
- 我的问题是结合用于获取它的技术,没有错误,我脑死了。

Here is the snippet:
#####
   <div class="ld_sec_col">
    <ul class="ld_details_list">
    <li><span class="ld_lbl">Exterior:</span> Brick</li>
    <li><span class="ld_lbl">Living style:</span> Bungalow</li>
    <li><span class="ld_lbl">Property type:</span> Detached</li>
    <li><span class="ld_lbl">Sewer system:</span> Sewers</li>                   </ul>
    </div>
### End Snippet ###

所以在这里我试图找到唯一的文本,(属性类型:)并抓住紧随其后的文本:

我显然在滥用 FIND。我被简化为反复试验。但我想在圣诞节前完成这个脚本。这是最后一项......

### START PHP CODE ###

$tempproptype = trim($entry->find('.ld_sec_col', 0)->plaintext);
if(preg_match('/^Property type: (.*),/', $tempproptype, $matches))
$propertytype = $matches[1];

### ENDPHP CODE ###

【问题讨论】:

  • 我认为你的正则表达式中有一个额外的空格和一个逗号,在那里找不到,不应该是 /^Property type:(.*)/ 吗?另请注意,结果可能还包含 html 标签,但请尝试一下
  • 现在是 2012 年。使用 XML 解析器。
  • 您已经在使用某种 HTML 解析器,因此也不要再使用正则表达式进行解析。继续使用它来处理 。你用来解析 HTML 的包是什么?

标签: php html-parsing


【解决方案1】:

替换正则表达式

'/^Property type: (.*),/'

'~Property type:</span>(.*)</li>~Ui'

【讨论】:

  • 正则表达式与您发布的 HTML 一致,我认为 $tempproptype 必须包含错误的内容。
【解决方案2】:

我认为这样的事情应该可行:

$html = <<<HTML
<div class="ld_sec_col">
<ul class="ld_details_list">
<li><span class="ld_lbl">Exterior:</span> Brick</li>
<li><span class="ld_lbl">Living style:</span> Bungalow</li>
<li><span class="ld_lbl">Property type:</span> Detached</li>
<li><span class="ld_lbl">Sewer system:</span> Sewers</li>                   </ul>
</div>
HTML;

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$propertytype = null;

if ($node = $xpath->query("//ul[@class='ld_details_list']/li[contains(.,'Property type:')]")->item(0)) {
    if(preg_match('/^Property type:(.*)$/', $node->nodeValue, $matches)) {
        $propertytype = trim($matches[1]);
    }
}

【讨论】:

  • 我喜欢这个外观。我无法从头开始重写脚本以使用 loadhtml 功能或查询功能,但尝试替换您的包含术语。还没有成功。
  • 我想我们都假设$tempproptype 包含sn-p,但是如果是这种情况,Wolfgang 的正则表达式和这都会起作用。您无需重写所有内容即可尝试 XPath 方法,只需将 $html 替换为您的 $tempproptype... 如果失败,请发布 var_dump($tempproptype) 的结果,以便我们查看变量实际包含的内容.
【解决方案3】:

试试 preg_match('/属性类型:([A-z]*)/', $tempproptype, $matches)

【讨论】:

  • 我试过了,谢谢你的想法 - 它没有产生任何内容。
【解决方案4】:

这就是我最终的结果:

$subpropertytypehtml = $html->find('.ld_details_list', 1)->find('li');          
        for($i=0;$i<count($subpropertytypehtml)-1;$i++)
        {
            if(preg_match('/Property type:/', $subpropertytypehtml[$i], $matches))
            {
                $subproptypehtml = trim($html->find('.ld_details_list', 1)->find('li', $i)->plaintext);
                $expsubproptypehtml=explode('Property type:',$subproptypehtml);
                $subpropertytype=$expsubproptypehtml[1];
                break;
            }               
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多