正则表达式与PHP中的预期不匹配?

时间:2012-08-22 05:14:03

标签: php regex

这就是我正在做的事情:我正在使用Simple HTML Dom从外部站点抓取一些HTML,然后我将空格去掉,我尝试使用正则表达式获取我需要的信息并将其放入阵列。这段代码完美运行,直到外部网站修改了他们的HTML,我不得不想出一个新的正则表达式。我制作了一个似乎捕获我想要的所有内容的正则表达式(我使用了regexr.com),但由于某种原因,我现在无法将其插入到我的代码中。这是PHP:

<?php
header("Content-Type: text/plain");

require('../classes/simple_html_dom.php');
$html = file_get_html('http://www.***.com/');
$player_array = array();
foreach($html->find('table#herodev_list td') as $ele){
    $ele = $ele->innertext;
    $html_string = $html_string.$ele;
}
$html_string = str_replace(" ", "", $html_string);
$regex = '/(?<=/avatar/).+?(?=/)/';
preg_match_all($regex, $html_string, $matches);
foreach($matches[0] as $player){
    array_push($player_array, strtolower($player));
}
print_r($player_array);

问题似乎在于preg_match_all - 匹配数组是空的,所以我假设没有匹配。以下是$ html_string的示例:

<imgsrc="http://minotar.net/avatar/Kainzo/10.png"><imgsrc="http://minotar.net/avatar/PuffinMuffin19/10.png"><imgsrc="http://minotar.net/avatar/neows0/10.png"><imgsrc="http://minotar.net/avatar/Sniped105/10.png"><imgsrc="http://minotar.net/avatar/EJBomber26/10.png"><imgsrc="http://minotar.net/avatar/GiantBeardedFace/10.png"><imgsrc="http://minotar.net/avatar/Montelu/10.png"><imgsrc="http://minotar.net/avatar/GreekCrackShot/10.png"><imgsrc="http://minotar.net/avatar/Marcellinius/10.png"><imgsrc="http://minotar.net/avatar/HelsEch/10.png"><imgsrc="http://minotar.net/avatar/NZD2000/10.png"><imgsrc="http://minotar.net/avatar/Mrchucklez/10.png"><imgsrc="http://minotar.net/avatar/Dragondrakar/10.png"><imgsrc="http://minotar.net/avatar/malita55/10.png"><imgsrc="http://minotar.net/avatar/Dazzlar/10.png">

我最好的猜测是,PHP的正则表达式引擎与Regexr有所不同,或者我只是在做一些愚蠢的事情。自从我最初编写这个应用程序以来已经有好几个月了,所以它的内部运作在我脑海中并不新鲜。任何帮助表示赞赏。

另外,请不要给我旧的,“不要使用正则表达式来解析HTML ...”的演讲。我知道。

顺便说一句,这是我的旧正则表达式正常工作(当然输入是不同的):
(?<=^|>)[^><]+?(?=<|$)

1 个答案:

答案 0 :(得分:4)

你必须在正则表达式代码中转义/。

- 编辑 -

ascii-lime还指出您可以将分隔符更改为另一个非字母数字字符(有例外)。要执行此操作,请将表达式的开头和结尾处的/更改为所选字符。例如:

'/.+\/regex.com\/index.html+./'

'!.+/regex.com/index.html+.!'