我试图从这样格式化的链接中拉出锚文本:
<h3><b>File</b> : <a href="/en/browse/file/variable_text">i_want_this</a></h3>
我只想要链接的锚文本:“i_want_this”
“variable_text”因文件名而异,所以我需要忽略它。
我正在使用这个正则表达式:
<a href=\"\/en\/browse\/file\/variable_text\">(.*?)<\/a>
这当然是匹配的完整链接。
答案 0 :(得分:1)
PHP使用与PCRE(PERL Regex)非常接近的版本。如果您想了解很多有关正则表达式的信息,请访问perlretut.org。另外,请查看exspresso等正则表达式生成器。
供您使用,请知道正则表达式是贪婪的。这意味着,当你指定你想要的东西时,任何东西(任何重复)后面都会有东西,它会一直持续到达第二个东西。
更清楚,你想要的是这个:
<a href="
">
</a>
除此之外,你想要捕获第二组“任何字符,任意次数”。您可以使用所谓的捕获组(将括号内的任何内容捕获为一组以供稍后参考,也称为后向引用)。
我也会研究命名的子模式 - 对于那些,您可以使用人类可读的字符串而不是数组索引来引用您的选择。 PHP中的语法是(?P<name>pattern)
,其中name是您想要的名称,pattern是实际的正则表达式。我将在下面使用它。
所有这一切,这里是你的正则表达式的“懒人网”:
<?php
$str = '<h3><b>File</b> : <a href="/en/browse/file/variable_text">i_want_this</a></h3>';
$regex = '/(<a href\=".*">)(?P<target>.*)(<\/a>)/';
preg_match($regex, $str, $matches);
print $matches['target'];
?>
//This should output "i_want_this"
哦,最后一个想法。根据您的具体操作,您可能需要查看SimpleXML而不是使用正则表达式。这可能要求我们看到的标签只是更大整体的标签,因为SimpleXML需要格式良好的XML(或XHTML)。
答案 1 :(得分:1)
我相信有人可能会有一个更优雅的解决方案,但我认为这会做你想做的事。
其中:
$subject = "<h3><b>File</b> : <a href=\"/en/browse/file/variable_text\">i_want_this</a></h3>";
选项1:
$pattern1 = '/(<a href=")(.*)(">)(.*)(<\/a>)/i';
preg_match($pattern1, $subject, $matches1);
print($matches1[4]);
选项2:
$pattern2 = '(<a href=")(.*)(">)(.*)(</a>)';
ereg($pattern2, $subject, $matches2);
print($matches2[4]);
答案 2 :(得分:0)
不要使用正则表达式来解析HTML。使用DOM解析器。指定您正在使用的语言。
由于它位于已捕获的群组中,并且由于您声称它是匹配的,因此您应该能够通过$1
或\1
引用它,具体取决于语言。
$blah = preg_match( $pattern, $subject, $matches );
print_r($matches);
答案 3 :(得分:0)
要记住的是,如果匹配,正则表达式会返回您搜索的所有内容。您需要指定只关心括号中包围的部分(锚文本)。我不确定你使用正则表达式的语言是什么,但这是Ruby中的一个例子:
string = '<a href="/en/browse/file/variable_text">i_want_this</a>'
data = string.match(/<a href=\"\/en\/browse\/file\/variable_text\">(.*?)<\/a>/)
puts data # => outputs '<a href="/en/browse/file/variable_text">i_want_this</a>'
如果在括号中指定所需内容,则可以参考:
string = '<a href="/en/browse/file/variable_text">i_want_this</a>'
data = string.match(/<a href=\"\/en\/browse\/file\/variable_text\">(.*?)<\/a>/)[1]
puts data # => outputs 'i_want_this'
Perl会让你使用$ 1代替[1]:
$string = '<a href="/en/browse/file/variable_text">i_want_this</a>';
$string =~ m/<a href=\"\/en\/browse\/file\/variable_text\">(.*?)<\/a>/;
$data = $1;
print $data . "\n";
希望有所帮助。
答案 4 :(得分:0)
如果我明白你的意思,我不是百分百肯定的。这将匹配锚标签之间的内容。该URL必须以/ en / browse / file /开头,但可能以任何内容结束。
#<a href="/en/browse/file/.+?">(.*?)</a>#
我使用#作为分隔符,因为它使它更清晰。如果你用单引号而不是双引号将它们放在一起也是有帮助的,所以你根本不必逃避任何事情。
如果您想限制数字,可以使用:
#<a href="/en/browse/file/[0-9]+">(.*?)</a>#
如果它只有5个数字:
#<a href="/en/browse/file/[0-9]{5}">(.*?)</a>#
如果它应该有3到6个数字:
#<a href="/en/browse/file/[0-9]{3,6}">(.*?)</a>#
如果它应该有两个以上的数字:
#<a href="/en/browse/file/[0-9]{2,}">(.*?)</a>#
答案 5 :(得分:0)
这应该有效:
<a href="[^"]*">([^<]*)
这就是说你找到了一切,直到你遇到“
[^"]*
相同!随身携带一切,直到你遇见&lt;
[^<]*
围绕[^&lt;] *
的paratese([^<]*)
分组吧!所以你可以用PHP收集这些数据!如果你查看PHP手册om preg_match,那么你会看到许多很好的例子!
祝你好运!对于你的具体例子:
<a href="/en/browse/file/variable_text">([^<]*)
我用
[^<]*
因为在某些例子中......
.*?
可能会非常慢!如果你可以使用
,请不要使用它[^<]*
答案 6 :(得分:0)
您应该使用Expresso工具创建正则表达式...非常方便.. http://www.ultrapico.com/Expresso.htm