2016-10-06 7 views
0

У меня есть кусок HTML кодов:Regex до матча слово «MAILTO»

<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:[email protected]" style="color:rgb(42,110,187);text-decoration:none" target="_blank">[email protected]</a> 
          </div> </td> 
          </tr> 

Я хочу, чтобы захватить путешественник адрес электронной почты. Я просто не могу задать регулярное выражение для слова mailto, потому что есть некоторые адреса электронной почты. Поэтому я думаю, что более конкретно, если я начинаю регулярное выражение с Traveler email.
Это выражение я сделал:

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

Но это не работает.
Пожалуйста, советую угадать, спасибо.

+0

'email +' и '[^ mailto:]' не делайте то, что, по вашему мнению, они делают. – Biffen

+0

Возможный дубликат [Learning Regular Expressions] (http://stackoverflow.com/questions/4736/learning-regular-expressions) – Biffen

+0

@biffen Я пропустил, спасибо. –

ответ

0

Пара вопросов в вашем подходе, вы должны использовать флаг «DOTALL», чтобы шаблон мог применяться к многострочному фрагменту, и вы не фиксируете фактический адрес электронной почты после «mailto». Как отмечали другие комментаторы, у вас есть некоторые основные проблемы синтаксиса regex в вашем шаблоне. Вот небольшой 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:[email protected]" 
    [1] => [email protected] 
) 

Узор:

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

устанавливает флаг DOTALL с «s» в конце, и использует «ленивый» sy ntax: ". *?" чтобы соответствовать всем символам до следующего символа «?». Без DOTALL, ". *?" не будет пересекать новые строки, и вы не получите никакого соответствия.

+0

привет, он может работать. каков последний '' символ? Спасибо. –

+0

S является «модификатором шаблона», который устанавливает флаг «DOTALL». См. [Здесь] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php) для более подробной информации. Таким образом вы можете установить несколько флагов. Если вы замените «s» на «si», например, шаблон будет нечувствителен к регистру. –

+0

Благодарим вас за источники. –

Смежные вопросы