-1

我有以下文字,想得到 src= 之后的“canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8%40group.calendar.google.com”。

是REGEX的方式吗?

$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>';

提前致谢。

4

2 回答 2

2

使用正则表达式。

preg_match("/\\?src=([^&\"]+)/i", $text, $results)
var_dump($results)
于 2013-04-23T12:38:50.510 回答
1

正则表达式可能是一种方式:

$src = preg_replace('(.*?(?<==)([^&"]+).*)i', '\\1', $text);

但是,我会给出以下提示:分。把一个问题分解成更小的问题,然后逐步解决整体问题。这适用于许多问题。举个例子:

  • 第一:从字符串中获取SRC属性值

有上千种方法可以做到这一点,包括。常用表达。由于正则表达式会假设字符串总是以这种方式格式化并且提取 URL 属性值实际上是微不足道的,所以我使用了一个支持正则表达式的不同函数sscanf

$url = sscanf($text, '<iframe src="%[^"]')[0];

# string(126) "http://www.google.com/calendar/embed?src=canaca.../Tokyo"

所以现在 URL 已经被提取了。由于这是一个 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"

这已经离我们正在寻找的价值又进了一步。所以还有一步要做:

  • 第三:从查询中解析SRC值

在这里,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 元素。即使位置发生变化,您也可以查找特定元素和属性。

于 2013-04-23T13:27:17.133 回答