我有一段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:]+)/
但它不起作用。
请你的建议猜,谢谢。
答案 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,“。*?”不会越过换行符,你将无法匹敌。