正则表达式链接的锚文本

时间:2010-07-14 03:03:25

标签: php regex

我试图从这样格式化的链接中拉出锚文本:

<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>

这当然是匹配的完整链接。

7 个答案:

答案 0 :(得分:1)

PHP使用与PCRE(PERL Regex)非常接近的版本。如果您想了解很多有关正则表达式的信息,请访问perlretut.org。另外,请查看exspresso等正则表达式生成器。

供您使用,请知道正则表达式是贪婪的。这意味着,当你指定你想要的东西时,任何东西(任何重复)后面都会有东西,它会一直持续到达第二个东西。

更清楚,你想要的是这个:

  1. <a href="
  2. 任何字符,任意次数(正则表达式=。*)
  3. ">
  4. 任何字符,任意次数(正则表达式=。*)
  5. </a>
  6. 除此之外,你想要捕获第二组“任何字符,任意次数”。您可以使用所谓的捕获组(将括号内的任何内容捕获为一组以供稍后参考,也称为后向引用)。

    我也会研究命名的子模式 - 对于那些,您可以使用人类可读的字符串而不是数组索引来引用您的选择。 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