2010-11-10 78 views
0

我想索引一系列共享相同格式的.html文件中的一些内容。在PHP中需要正则表达式的帮助

所以我得到了很多的行这样的:<a href="meh">[18] blah blah blah < a...

这个想法是提取次数(18)和文本旁边(等等...)。此外,我知道每条排位赛线路将从">开始,并以<a</p结束。该问题源于需要将所有其他htmHTML标签保留为文本的一部分(<i><u>等)。

于是我有这样的事情:

$docString = file_get_contents("http://whatever.com/some.htm"); 
$regex="/\">\ [(.*?)\ ] (<\/a>)(.) *?(<)/"; 
preg_match_all($regex,$docString,$match); 

让我们来看看$regex为秒。忽略它的空间,我只是把它们放在这里,因为有些人物消失了。我指定它将以">开头。然后我做[]事情里面的数字。然后我选出了</a>。到现在为止还挺好。

最后,我做了一个(.)*?(<)。这是转折点。通过留下最后一位,(<)就像那样,当找到下划线或斜体标记时,文本将被中断。但是,如果我将(<a|</p)结果数组结束为空。我试过把它改成只有(<a),但看起来2个人物搞砸了整个TING。

我该怎么办?我一整天都在苦苦挣扎。

回答

0

正如您发现的那样,使用正则表达式来解析HTML并不容易。这是因为HTML不是特别规则的。

我建议使用XML解析器,例如PHP的DomDocument

创建一个对象,然后使用loadHTMLFile方法打开文件。将a标签提取为getElementsByTagName,然后将内容提取为NodeValue属性。

它可能看起来像

// Create a DomDocument object 
$html = new DOMDocument(); 

// Load the url's contents into the DOM 
$html->loadHTMLFile("http://whatever.com/some.htm"); 

// make an array to hold the text 
$anchors = array(); 

//Loop through the a tags and store them in an array 
foreach($html->getElementsByTagName('a') as $link) { 
    $anchors[] = $link->nodeValue; 
    } 

一种可以替代的风格的XML/HTML解析器phpquery。他们页面上的文档应该很好地解释如何提取标签。如果你知道jQuery,界面看起来更自然。

1

/">\[(.*)\](.*)(?:<(?:a|\/p))/之类的东西似乎正常工作,给你的例子和描述。也许增加非捕获子模式呢?请提供一个反例,其中这不适合你。

虽然我同意RegEx不是解析器,但它听起来像是你正在寻找的东西是定期表现字符串的一部分 - 这正是RegEx强大的地方。

+0

我会尽快尝试,只要有机会,谢谢。 – navand 2010-11-12 14:22:57