我有以下文字,想要获得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>';
提前致谢。
答案 0 :(得分:2)
使用正则表达式。
preg_match("/\\?src=([^&\"]+)/i", $text, $results)
var_dump($results)
答案 1 :(得分:1)
正则表达式可能是一种方式:
$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 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元素。即使位置发生变化,您也可以查找特定元素和属性。