修改后的PHP get_meta_tags不适用于某些URL

时间:2015-08-05 16:45:25

标签: php regex meta-tags

我正在尝试使用php.net上的user contributed notes代码来get_meta_tags函数。从它看来,如果元标记格式为<meta content="foo" name="bar" />,那么代码将会错过它。目前,只有格式为<meta name="bar" content="foo"/>的标签才有效。我对正则表达式并不好,并试图修复它没有成功。这是一个url的示例,它似乎滑过了正则表达式。提前道歉我的问题不一定是关于get_meta_tags功能,但似乎这可能与人们在该功能中遇到的其他一些问题失去联系。

似乎问题就在这附近:

preg_match_all('/<[\s]*meta[\s]*(name|property)="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);

可能需要像:

preg_match_all('/<[\s]*meta[\s]*(name|property|content)="?' . '([^>"]*)"?[\s]*' . '(content|name)="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);

但同样,我对正则表达式非常糟糕。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

一个想法是捕获lookahead内的元名/属性,使其独立于序列:

function extract_meta_tags($source)
{
  $pattern = '
  ~<\s*meta\s

  # using lookahead to capture type to $1
    (?=[^>]*?
    \b(?:name|property|itemprop|http-equiv)\s*=\s*
    (?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
    ([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
  )

  # capture content to $2
  [^>]*?\bcontent\s*=\s*
    (?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
    ([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
  [^>]*>

  ~ix';

  if(preg_match_all($pattern, $source, $out))
    return array_combine(array_map('strtolower', $out[1]), $out[2]);
  return array();
}

test at regex101。使用branch reset功能提取不同报价样式的值。

print_r(extract_meta_tags($str));尝试使用一些不同的数据at eval.in

在html <head>部分使用此功能。获取页面源并提取头部:

1。)使用cURLfile_get_contentsfsockopen获取来源。

2.。)使用dom或正则表达式like this: <head>提取(?is)<head\b[^>]*>(.*?)</head>

3.。)使用提供的正则表达式或try with a parser<head>提取元标记。