正则表达式可能是一种方式:
$src = preg_replace('(.*?(?<==)([^&"]+).*)i', '\\1', $text);
但是,我会给出以下提示:分治。把一个问题分解成更小的问题,然后逐步解决整体问题。这适用于许多问题。举个例子:
有上千种方法可以做到这一点,包括。常用表达。由于正则表达式会假设字符串总是以这种方式格式化并且提取 URL 属性值实际上是微不足道的,所以我使用了一个支持正则表达式的不同函数sscanf
:
$url = sscanf($text, '<iframe src="%[^"]')[0];
# string(126) "http://www.google.com/calendar/embed?src=canaca.../Tokyo"
所以现在 URL 已经被提取了。由于这是一个 URL,因此可以使用标准 URL 函数对其进行处理。让我们来看看:
要从 URL 中获取 SRC 值,您可以再次使用正则表达式。但是,由于 PHP 具有特定于 URL 处理的函数,所以我使用它们来代替。我可以准确地说出我需要什么parse_url
。而这一次我首先需要 URL 的查询部分。那是问号后面有查询变量的部分:
$query = parse_url($url, PHP_URL_QUERY);
# string(89) "src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88.../Tokyo"
这已经离我们正在寻找的价值又进了一步。所以还有一步要做:
在这里,PHP 再次内置了一个函数来执行此操作。parse_str
我们可以使用该函数从 URL 中提取查询中的所有变量。由于它通过函数参数返回结果,因此现在需要两行代码:
parse_str($query, $vars);
$src = $vars['src'];
# string(68) "canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8@group.calendar.google.com"
现在$src
变量中是您要查找的值。
上面的整个代码一目了然:
$text = '<iframe src="http://www.google.com/calendar/embed?src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8%40group.calendar.google.com&ctz=Asia/Tokyo" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>';
$url = sscanf($text, '<iframe src="%[^"]')[0];
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $vars);
$src = $vars['src'];
var_dump($url, $query, $src);
输出如下,显示了所有三个步骤:
string(126) "http://www.google.com/calendar/embed?src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8%40group.calendar.google.com&ctz=Asia/Tokyo"
string(89) "src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8%40group.calendar.google.com&ctz=Asia/Tokyo"
string(68) "canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8@group.calendar.google.com"
因此,无论您在每个步骤中使用哪些功能:如果您将问题分成更小的部分,您几乎总是能够解决更大的问题。而且,如果其中一个子步骤出现问题,您只需修复一个步骤 - 而不是整个操作。如果您使用单个正则表达式来完成所有这些工作,那么您将遇到单点故障(并且在 HTML 和 URL 的世界中制作一个好的正则表达式并非易事,因此它很可能会中断)。
例如,一个完美的解决方案是在第一步中使用 HTML 解析器。例如使用Tidy 扩展或流行的DOMDocument 扩展:
// Tidy (non error-checked):
$url = tidy_parse_string($text)->body()->child[0]->attribute['src'];
// DOMDocument (non error-checked):
$url = @DOMDocument::loadHTML($text)->getElementsByTagname('iframe')
->item(0)->getAttribute('src');
HTML 解析器的好处是它可以理解 HTML 元素。即使位置发生变化,您也可以查找特定元素和属性。