从字符串中获取所有<a>标签的文本

3

由于我对正则表达式完全无能为力,这已经困扰了我半个小时,我想我会把它发布在这里,因为它可能非常简单。

<a href="/folder/files/hey/">hey.exe</a>
<a href="/folder/files/hey2/">hey2.dll</a>
<a href="/folder/files/pomp/">pomp.jpg</a>

在PHP中,我需要提取位于<a>标签之间的内容,例如:
hey.exe
hey2.dll
pomp.jpg

相关:查找<a>和</a>标签内的文本 - mickmackusa
5个回答

6
避免使用 '.*' 即使你将其变成非贪婪模式,除非你对正则表达式有更多的实践经验。我认为一个好的解决方案是:
'/<a[^>]+>([^<]+)<\/a>/i'

请注意'/'分隔符-您必须在PHP中使用preg系列的正则表达式函数。代码应该像这样:
preg_match_all($pattern, $string, $matches);
// matches get stored in '$matches' variable as an array
// matches in between the <a></a> tags will be in $matches[1]
print_r($matches);

建议不要使用(.*),而是使用排除性字符类。+1 - Tomalak

2

这是一个非常简单的例子:

<a.*>(.*)</a>

然而,如果在同一行中有多个匹配项,您需要小心,例如:
<a href="/folder/hey">hey.exe</a><a href="/folder/hey2/">hey2.dll</a>

在这种情况下,正确的正则表达式应该是:
<a.*?>(.*?)</a>

注意 '*' 量词后面的 '?'。默认情况下,量词是贪婪的,这意味着它们会尽可能地占用更多的字符(在本例中仅返回 "hey2.dll")。通过添加问号,可以使它们变成非贪婪的,这应该更符合您的需求。

2

这似乎可以工作:

$pattern = '/<a.*?>(.*?)<\/a>/';

2
我发现这个正则表达式测试工具非常有用。 点击此处使用。

更好的选择是:http://gskinner.com/RegExr/(Flash 实现,交互性强) - Tomalak
1
ICG测试工具基于.NET,RegExr是ActionScript,Rubular是Ruby。考虑到原帖中使用了PHP,推荐基于PHP的测试工具可能更有帮助。http://www.google.com/search?q=PHP+regex+tester - Alan Moore

2

<a href="[^"]*">([^<]*)</a>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接