繁体   English   中英

没有另一个使用正则表达式解析HTML的问题

[英]Not Another Parse-HTML-With-Regex Question

我在这里阅读了一些有关使用regex解析HTML的问题,并且我理解总体上来说这是一个糟糕的主意。

说了这么多,我有一个非常具体的问题,我认为正则表达式可能是答案。 我一直在摸索尝试找出答案,但是(今天)我对Regex还是陌生的,我希望有一个善良的人可以帮助我。

我有一个始终遵循以下格式的字符串数组

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

我希望实现的只是留下“某处”和“事物名称”,以便我可以仅输出<a href="somewhere">name of thing</a>

字符串数组来自我的Facebook个人资料上的链接的RSS提要(如果您碰巧)。

非常感谢您的帮助。

插口

从实用主义的角度来看,我完全理解您的出身。

但是PHP确实有一个非常不错的/简单的HTML解析器 ,并且看起来很简单,要使它起作用,我会毫不犹豫地推荐它。

我不了解PHP,但是您可以使用以下(极其脆弱的)正则表达式:

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

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

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

<a .*?href="(.+?)".*?>(.+?)</a>
$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]将包含您的链接文本。

在括号内,我用排除字符定义了您感兴趣的那些段的内容。 第一个是[^ \\“] +,它是除双引号以外的任何字符的一个或多个。第二个是[^ <] +,它是除小于号之外的任何字符的一个或多个。这确保了,如果标记的格式始终与您提供的格式一致,则您感兴趣的部分的每一侧都有明确定义的边界。

SLaks regex可能会对除href之外没有其他属性的URL产生一些问题,这是我的看法:

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

我已经用自己的Facebook feed进行了测试,并且可以使用SimpleXML加载它。 好吧,部分。 无法直接加载RSS feed,但是如果首先使用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将会抱怨。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM