正则表达式在没有特定类的情况下替换链接

时间:2011-12-22 18:41:30

标签: regex preg-replace preg-match

我努力寻找解决办法但却无法做到。 Yup正则表达式太复杂了。无论如何这里是问题。

目的: 我想用PHP中的cdn图像链接替换图像链接。为了做到这一点,我认为更好的是使用preg_replace。

如果链接是/var/b.png或http://www.example.com/png它将被替换为CDN,但如果src或类包含'captcha',那么它不应该是动态的。

首先我要尝试:

$_SERVER["HTTP_HOST"] = 'www.bring.com';
$preg_host = preg_quote($_SERVER["HTTP_HOST"], '/');
$content = preg_replace('/((\<image\s+.*?src\=)(["\']http\:\/\/'.$preg_host.')(\/.*?["\'](^(?=.*(captcha)))(.*)?\>))/i', '$2$3.nyud.net:8080$4', $content);
$content = preg_replace('/(\<image\s+.*?src\=["\'])(\/.*?["\'].*?\>)/i', '$1http://'.$_SERVER['HTTP_HOST'].'.nyud.net:8080$2', $content);

条件是: 什么时候不做:src可以包含“captcha”字,在某些情况下类包含“captcha”,这个类可以提前或src或src后面,这使得它更复杂。在这些情况下,我不想替换链接,例如:

$content = <<<END
<image
type="image" src="/skins/bph/customer/images/icons/go.gif" alt="Search" title="Search" class="go-button" />
<image
id="verification_image_login_login_popup_form" src="http://www.bring.com/index.php?dispatch=image.captcha&amp;verification_id=%3Alogin_login_popup_form&amp;login_login_popup_form4ef33269bf30b=" alt="" onclick="this.src += 'reload' ;"  width="100" height="25" class="image-captcha valign"  /></p><div
class="clear">
<image
id="verification_image_login_login_popup_form" class="valign" src="http://www.bring.com/skins/bph/customer/images/icons/go.gif" alt="" onclick="this.src += 'reload' ;"  width="100" height="25" /></p><div
class="clear">

END;

结果是:

不应该被替换,但正好相反:(

以下应该获得替换,因为它没有任何带验证码的类或链接有验证码字

<image
id="verification_image_login_login_popup_form" class="valign" src="http://www.bring.com/skins/bph/customer/images/icons/xxx" alt="" onclick="this.src += 'reload' ;"  width="100" height="25" /></p>

1 个答案:

答案 0 :(得分:1)

强烈建议使用PHP DOM parser,而不是试图通过使用正则表达式魔术(可能会在意外时刻咬你)来解决整个问题。

使用DOM解析器遍历所有图像并检查其src和类属性,并根据需要修改链接。

如果你在SO或Google上搜索它,你可以看到很多关于使用DOM的例子。