0

我正在尝试从页面内的 javascript 函数中解析直接链接。我能够解析我需要的 html 信息,但对 javascript 部分感到困惑。这是用 php 和可能的正则表达式可以实现的吗?

function videoPoster() {
    document.getElementById("html5_vid").innerHTML = 
        "<video x-webkit-airplay='allow' id='html5_video' style='margin-top:" 
        + style_padding 
        + "px;' width='400' preload='auto' height='325' controls onerror='cantPlayVideo()' " 
        + "<source src='http://video-website.com/videos/videoname.mp4' type='video/mp4'>";
}

我需要拉出的是链接“http://video-website.com/videos/videoname.mp4”。任何帮助或指示将不胜感激!

4

4 回答 4

2

/http://.*\.mp4/http://将为您提供和之间的所有字符.mp4,包括在内。

在行动中看到它。

如果您需要会话 ID,请使用类似/http://.*\.mp4?sessionid=\d+/

于 2013-01-03T02:27:52.760 回答
2

一般来说,没有。一个完整的 javascript 解析器总是会提取 url,即使这样你也会遇到不平凡计算的 url 的麻烦。

在实践中,通常最好使用适用于您实际需要解析的代码的最简单的捕获正则表达式。在这种情况下:

['"](http://[^'"]*)['"]

如果您必须将该正则表达式作为字符串输入,请注意转义。

如果您在 url 中有未转义的引号,这将失败。这是有效的,但很少见。编写您正在解析的内容的人不太可能使用它们,因为它们使引用 javascript 中的 url 变得很痛苦。

于 2013-01-03T02:30:48.823 回答
0

对于您的特定情况,这应该有效,前提是 URL 中没有任何字符被转义。

preg_match("/src='([^']*)'/", $html, $matches);
$url = $matches[1];

请参阅preg_match()手册页。您可能应该添加错误处理,确保函数返回 1(正则表达式匹配)并可能执行一些额外的检查(例如确保 URL 以http://和 contains开头.mp4?)。

(与所有 Web 抓取技术一样,您正在抓取的站点的所有者或维护者可能会在未来做出破坏您的脚本的更改,您应该为此做好准备。)

于 2013-01-03T02:49:15.880 回答
0

以下捕获您的 html 中的任何 url

$matches=array();
if (preg_match_all('/src=["\'](?P<urls>https?:\/\/[^"\']+)["\']/', $html, $matches)){
    print_r($matches['urls']);
}

如果你想在 javascript 中做同样的事情,你可以使用这个:

var matches;
if (matches=html.match(/src=["'](https?:\/\/[^"']+)["']/g)){
//gives you all matches, but they are still including the src=" and " parts, so you would
//have to run every match again against the regex without the g modifier
}
于 2013-01-03T11:35:06.930 回答