我已经阅读了一些关于使用正则表达式解析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源。
很多,非常感谢你的帮助。杰克
答案 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)
答案 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会抱怨。