正则表达式匹配单词“mailto”

时间:2016-10-06 05:02:29

标签: php regex

我有一段HTML代码:

<tr style="padding:0;vertical-align:top;text-align:left"> 
                           <td style="word-break:break-word;border-collapse:collapse;padding:5px 10px;vertical-align:top;text-align:left;color:rgb(51,51,51);font-family:Helvetica,Arial,sans-serif;font-weight:bold;margin:0;line-height:19px;font-size:14px;width:270px;border-bottom:1px dotted rgb(212,212,212);border-left:none"> Traveler email </td> 
                           <td style="word-break:break-word;border-collapse:collapse;padding:5px 10px;vertical-align:top;text-align:left;color:rgb(51,51,51);font-family:Helvetica,Arial,sans-serif;font-weight:normal;margin:0;line-height:19px;font-size:14px;width:270px;border-bottom:1px dotted rgb(212,212,212)"> 
                            <div align="right"> 
                             <a href="mailto:anarky@gmail.com" style="color:rgb(42,110,187);text-decoration:none" target="_blank">anarky@gmail.com</a> 
                            </div> </td> 
                          </tr>

我想抓住旅行者的电子邮件地址。我不能直接使用正则表达式mailto,因为有一些电子邮件地址。所以我认为如果我从Traveler email开始正则表达式,那就更具体了 这就是我所做的表达:

/Traveler\semail+([^mailto:]+)/

但它不起作用。
请你的建议猜,谢谢。

1 个答案:

答案 0 :(得分:0)

您的方法中存在一些问题,您需要使用“DOTALL”标志来允许模式应用于多行代码段,并且您不会在“mailto”之后捕获实际的电子邮件地址。正如其他评论者指出的那样,您的模式中也存在一些基本的正则表达式语法问题。这是一个小的PHP文件,它做我认为你想要的,可能是有益的。在示例中,“snippet.txt”是php脚本的本地,包含您的示例html。

<?php
$myfile = fopen("snippet.txt", "r") or die("Unable to open file!");
$contents =  fread($myfile,filesize("snippet.txt"));
fclose($myfile);
$pattern = '/Traveler\s+email.*?mailto:(.*?)"/s';
preg_match($pattern,$contents,$matches);

print_r($matches);
?>

在命令行上运行:

php -f thescript.php

你得到了结果:

Array
(
    [0] => Traveler email </td>
                           <td style="word-break:break-word;border-collapse:collapse;padding:5px 10px;vertical-align:top;text-align:left;color:rgb(51,51,51);font-family:Helvetica,Arial,sans-serif;font-weight:normal;margin:0;line-height:19px;font-size:14px;width:270px;border-bottom:1px dotted rgb(212,212,212)">
                        <div align="right">
                         <a href="mailto:anarky@gmail.com"
    [1] => anarky@gmail.com
)

模式:

$pattern = '/Traveler\s+email.*?mailto:(.*?)"/s';

在末尾设置带有“s”的DOTALL标志,并使用“lazy”语法:“。*?”仅匹配“?”后面的所有字符。没有DOTALL,“。*?”不会越过换行符,你将无法匹敌。