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

标签 php regex meta-tags

我正在尝试使用 user contributed notes 中的代码在 php.net 上的 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);

不过,我对正则表达式的使用非常糟糕。有什么想法吗?

最佳答案

一个想法是在 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.) 使用 cURL 获取源代码, file_get_contentsfsockopen .

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

3.) 从 <head> 中提取元标签通过使用提供的正则表达式或 try with a parser .

关于php - 修改后的 PHP get_meta_tags 不适用于某些 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31838347/

相关文章:

javascript - jQuery ui Datepicker 半天

php - 移动到生产环境时 Web App 失败。我需要哪些服务器权限?

javascript - 正则表达式:获取逗号之前最后一个字符出现之间的字符串

android - 什么正则表达式用于从 wpa_supplicant.conf 获取网络对象?

seo - 我是否以正确的方式使用我的元标签?

php - Apache/PHP 下载 index.php 而不是显示..?

php - 我们可以在 php 中的另一个类中创建一个类的对象吗?

javascript - 尝试在 JavaScript 中使用 Gruber 的 "invalid group"URL 匹配正则表达式模式时,如何修复 "improved"错误?

javascript - 路由更改时更改元标记