不是另一个Parse-HTML-With-Regex问题

时间:2010-01-21 17:51:47

标签: php html regex parsing

我已经阅读了一些关于使用正则表达式解析HTML的问题,我知道这总的来说是一个糟糕的想法。

说完这个,我有一个非常具体的问题,我认为正则表达可能是答案。我一直在努力寻找答案,但我是新的(今天)到Regex,我希望有些善良的人可以帮助我。

我有一个字符串数组,始终遵循格式

STUFF HERE<a href="somewhere" title="something" target="_blank">name of thing</a>STUFF HERE

我希望实现的只是留下'某处'和'名称的东西,以便我只能输出<a href="somewhere">name of thing</a>

如果您感兴趣的话,字符串数组来自我个人资料中的链接的RSS源。

很多,非常感谢你的帮助。

杰克

5 个答案:

答案 0 :(得分:8)

我完全理解你从实用主义的角度出发的地方。

然而,PHP确实有一个非常nice/straightforward HTML parser,并且它似乎足够简单,我可以犹豫而不是来推荐它。

答案 1 :(得分:2)

我不懂PHP,但你可以使用以下(极其脆弱的)正则表达式:

<a href="(.+?)" title=".+?" target="_blank">(.+?)</a>

这将捕获链接的URL和文本。

如果您想要更灵活,可以允许任何属性,例如:

<a .*?href="(.+?)".*?>(.+?)</a>

答案 2 :(得分:0)

$str = 'STUFF HERE<a href="somewhere" title"something" target="_blank">name of thing</a>STUFF HERE';
$success = preg_match('/.*href=\"([^\"]+)\".*>([^<]+)<.*/i', $str, $matches);
if ($success) {
    echo $matches[1];
    echo $matches[2];
} else {
    echo "Parsing failed.";
}

括号子句隔离$ matches数组的匹配部分。如果模式完全匹配字符串,则$ matches [1]将包含您的href,$ matches [2]将包含您的链接文本。

在括号内,我正在定义您对排除字符感兴趣的段的内容。第一个是[^ \“] +,它是除双引号之外的任何字符中的一个或多个。后者是[^&lt;] +,它是除了小于的任何字符中的一个或多个。这确保了,如果标记始终采用您提供的格式,那么您在您感兴趣的部分的任何一侧都有明确定义的边界。

答案 3 :(得分:0)

对于href以外没有其他属性的网址,

SLaks regex可能存在一些问题,这是我的看法:

~<a.+?href="(.+?)".*?>(.+?)</a>~i

答案 4 :(得分:0)

我已经使用自己的Facebook Feed进行了测试,可以使用SimpleXML加载它。好吧,部分。 RSS源无法直接加载,但如果您首先使用MagPie获取Feed,则可以使用SimpleXml加载description元素,如下所示:

$xml = simplexml_load_string($description); // load description
$link = $xml->xpath('//a');                 // find all links inside
$href = (string) $link[0]['href'];          // get URL
$text = (string) $link[0];                  // and link text

只要Facebook不破坏描述中的HTML,就可以安全地使用SimpleXml。如果它们破坏它,SimpleXml会抱怨。