2013-05-10 5 views
1

Я хотел сопоставить гиперссылку с разными Атрибуты как href, rel, target, media. Я ищу определенное регулярное выражение, содержащее эти атрибуты (rel, носители необязательны).Регулярное выражение для гиперссылки

Как я вставляю этот код в свой парсер, я не могу позволить себе использовать класс DOM, поэтому я ищу решение с регулярным выражением.

Позвольте мне ниже пример, чтобы объяснить:

<a href="http://www.google.com" rel="nofollow" target="_blank">Google</a> 
    <a href="http://www.google.com" rel="follow" target="_blank">Google</a> 
    <a href="http://www.google.com" target="_blank">Google</a> 

Это то, что я получил в настоящее время

/<a\s?(href=)?('|")(.*)('|") (rel='|")(nofollow|follow)('|") target=('|")_blank('|") (media='|")(.*?)('|")>(.*)<\/a>/ 
+2

Используйте этот HTML-парсер для этого, а не для регулярного выражения! (Я уверен, что вы можете «позволить себе») – nickb

+0

Не подскажете, как это будет лучше, чем регулярное выражение. – Som

+1

Ваше регулярное выражение очень подвержено ошибкам и, вероятно, не сможет представить все возможности ввода, которые вы получите, особенно не в одном регулярном выражении. Между тем, парсер HTML всегда сможет обрабатывать любой (действительный) ввод, который вы ему даете, и вы сможете легко извлекать информацию, которую ищете. Если вы захотите использовать парсер HTML, такой как встроенный класс DOMDocument в PHP, я могу добавить ответ, показывающий, как вы можете достичь своих целей. – nickb

ответ

3

Вот решение с DOMDocument класса PHP. Я даже включить логику для проверки требуемых/необязательные атрибуты:

// Load up your HTML 
$doc = new DOMDocument; 
$doc->loadHTML($html); 

// Define attributes that we are looking for in name => required pairs 
$attributes = array('href' => true, 'rel' => false, 'target' => true, 'media' => false); 

$parsed_tags = array(); 

// Iterate over all of the <a> tags 
foreach($doc->getElementsByTagName('a') as $a) { 
    $tag_attributes = array(); 
    foreach($attributes as $name => $required) { 
     if(!$a->hasAttribute($name)) { 
      if($required) { 
       echo 'Error, tag is required to have ' . $name . ' attribute and it is missing' . "\n"; 
       continue 2; 
      } 
     } else { 
      // Has the attribute, required or not lets grab it 
      $tag_attributes[$name] = $a->getAttribute($name); 
     } 
    } 
    $parsed_tags[] = $tag_attributes; 
} 

С этой HTML строки:

$html = '<a href="http://www.google.com" rel="nofollow" target="_blank">Google</a><a href="http://www.google.com" rel="follow" target="_blank">Google</a><a href="http://www.google.com" target="_blank">Google</a>'; 

Это produces:

Array 
(
    [0] => Array 
     (
      [href] => http://www.google.com 
      [rel] => nofollow 
      [target] => _blank 
     ) 

    [1] => Array 
     (
      [href] => http://www.google.com 
      [rel] => follow 
      [target] => _blank 
     ) 

    [2] => Array 
     (
      [href] => http://www.google.com 
      [target] => _blank 
     ) 

) 

Обратите внимание, что с этим решением, потому что я Проверяем, имеются ли требуемые атрибуты и делают continue 2;, если они не означают, что <a> теги без r equired атрибуты пропущены, как видно из this demo, где тег <a href="http://www.google.com">Google</a> выводит строку ошибки, которую я вставлял, но не не включается в выходной массив.

+0

Спасибо за ваше время. Я использую mybb forum srcipt, и мне нужно вставить regex в parser, чтобы соответствовать внешним URL-адресам и делать с ними что-то. Сначала я подумал, что имеет регулярное выражение для DOM снова, мне нужно использовать HTML DOM. – Som

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