如何用php提取部分文本

时间:2013-04-23 12:37:22

标签: php regex

我有以下文字,想要获得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>';

提前致谢。

2 个答案:

答案 0 :(得分:2)

使用正则表达式。

preg_match("/\\?src=([^&\"]+)/i", $text, $results)
var_dump($results)

答案 1 :(得分: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 extension或流行的 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元素。即使位置发生变化,您也可以查找特定元素和属性。