PHP preg_replace与src ../

时间:2015-12-04 05:43:53

标签: preg-replace

Orignal Code

<script language="javascript" src="/lta/vrl/scripts/vrlCommons.js"></script>
<script language="JavaScript" src="../scripts/formObjCommons.js"></script>

我的代码

$url = "https ://example.com";
$url2 = "https ://example.com/lta/vrl";
$result = file_get_contents('https://example.com', false, $context);
$result = preg_replace('/src="(https:\/\/)?([^"]+)"/', "src=\"$url\\2\"", $result);

如何制作?

  <script language="javascript" src="$url/lta/vrl/scripts/vrlCommons.js"></script>
  <script language="JavaScript" src="$url2/scripts/formObjCommons.js"></script>

1 个答案:

答案 0 :(得分:0)

如果您要使用file_get_contents访问互联网上的随机页面,并尝试重写页面的上下文以指向您的域,从而实际上创建代理浏览器,您应该知道有很多格式错误网页在那里。不要尝试使用正则表达式解析HTML,如下所述:RegEx match open tags except XHTML self-contained tags

然而,我 建议的是使用HTML解析引擎,它可以补偿HTML中的噪音,纠正格式错误的文档,浮动尖括号,并将有问题的字符转换为实体,最后允许您将文档解析为HTML页面,就像JavaScript可以如何遍历页面的节点一样。

我发誓的一个PHP库,已成功用于大型项目,即使是与SEO相关的内容和长文档而没有进入正则表达式的记忆限制,也是http://simplehtmldom.sourceforge.net/ 下载完成后,您只需在项目中加入simple_html_dom.php即可。然后使用你的代码库,你会做:
$dom = str_get_html($result); 从那里,使用manual中提到的DOM方法。首先选择您要更改的所有元素,或选择所有元素*。然后遍历它们并检查是否设置了src属性。如果是,请获取src的值,即其URL,然后将其域替换为您的域。要做我们,不要使用正则表达式,有很多URL结构,它可以得到//的复杂检查意味着使用当前方案或子域,所以你不知道要搜索多少个点对于或试图搜索正斜杠,可能会出现一个,你会遇到一个?表示查询字符串或#的哈希值。或者,为了完全摆脱水中的所有逻辑,你可能会遇到一个@,其中的用户名后跟一个冒号,然后是密码,然后是域名...这里有一个非常简单的方法可以用PHP完成因为它们具有专门用于用新的部分更换网址的功能设计。该函数是http_build_url。可悲的是,它并没有被广泛支持,并且可能在您的服务器上不可用。如果它不存在,则存在替代here为您定义它。我不知道它有多可靠,但我发现它依赖于parse_url,我本来会提出的功能。想法是你要解析URL,获取你想要的主机部分,然后再手动重建URL。但我更喜欢http_build_url,因为这项工作变得简单。

要测试http_build_url函数,您可以尝试:

echo http_build_url('http://google.com/search?q=yay',array('host'=>'example.com'));

一旦你完成了这项工作,你应该知道如何轻松地替换URL。 然后,您需要使用我之前链接到的简单HTML DOM解析库,将src属性更新为新URL。

对DOM文档进行更改后,您将执行以下操作:

$result=$dom->save();

然后,您将更新后的文档重新加载到您正在处理的$result字符串中,并准备好向用户提供看似代理浏览器的内容。