当前位置: >首页>新闻列表>惠州网站设计,php正则的css替换换
我们看下我们的需求,我们需要匹配css路径,包含http的,https的,//的,也包含./,包含/,这种挺复杂的路径,我们如果是按照if来判断的话,就需要做好多种匹配,然后在识别替换。这种方式就比较麻烦。惠州网站设计今天就用php和正则来讲解下怎么实现这个代码。
首先,我们来看看代码
array(6) {
[0]=>
string(21) "url(http://images/ydhlw.jpg"
[1]=>
string(25) "url(..//images/dixian.jpg"
[2]=>
string(29) "url(https://Img/images_p/cust1/1.jpg"
[3]=>
string(29) "url(/Img/images_p/cust1/2.jpg"
[4]=>
string(29) "url(//Img/images_p/cust1/3.jpg"
[5]=>
string(29) "url(./Img/images_p/cust1/4.jpg"
}
这里是我们收录的几个代码片段。这里是通过preg_match_all提取出来的,我们就加上了刚才说的几个情况。
现在我们要提取他们里面的()的内容。但是,我们只要 /Img/images_p/cust1/4.jpg 的内容,不要双引号,不要http也不要https,不要//,不要./,不要/等等。如果是通过if来做的话,就要一个个情况去判断,这样的话,代码就有点多了。今天惠州网站设计就用preg_replace来做替换。
那么替换之前,我们要获得到我们想要的内容,而且提取到内容之后,还要使用提取到的内容。
首先,我们先看看我们的正则匹配代码。
/url\(((http(s?)\:)?(\/\/)?[^"\/]*)?(\/)?([^")]*)/iu ,i不区分大小写, u不贪婪模式。
url() 这个就是url开头,包含()这个里面的内容,其中()要用\转义下。也就是url\(\)
http(s?) 表示 http或着https开头的 ?表示匹配0次或者1次,就是说匹配http 或者https的。
(http(s?)\:)?表示 http:或者https:,为什么要这么写呢?因为有时候可能要匹配到 //这个情况的。然后我们看看下面的
(http(s?)\:)?(\/\/)? 表示匹配http:// 或者https:// ,或者匹配 //这几个情况
[^"\/]*)?表示匹配 不是"或者/的其他任意字符,主要作用就是为了后面加域名比如http://fz.tywl88.com 或者https://fz.tywl88.com 或者 //fz.tywl88.com 这三种情况。
(\/)? 表示匹配/或者不匹配,意思就是/ 可有可无。
([^")]*表示不匹配双引号的其他字符。
然后,我们来看括号
第一个\( 这个就不用看了,他是当成了识别字符,不是正则的计算分组字符。
(http(s?)\:)?(\/\/)?[^"\/]*)?(\/)?([^")]*)
从这段代码开始看。
第一个括号是 ((http(s?)\:)?(\/\/)?[^"\/]*)?(\/)?([^")]*) 包含全部的。
第二个括号是 ((http(s?)\:)?(\/\/)?[^"\/]*)?
第三个括号是 (http(s?)\:)?这里的。
第四个括号是 http(s?)
第五个括号是 (\/\/)?
第六个括号是 (\/)?
第七个括号是 ([^")]*) 其中国第七个就是我们需要的内容,在数组种,是以0开始的,所以第七个的下标就是6,
我们看看我们的效果截图
array(7) {
[0]=>
array(6) {
[0]=>
string(27) "url(http://images/ydhlw.jpg"
[1]=>
string(25) "url(..//images/dixian.jpg"
[2]=>
string(36) "url(https://Img/images_p/cust1/1.jpg"
[3]=>
string(29) "url(/Img/images_p/cust1/2.jpg"
[4]=>
string(30) "url(//Img/images_p/cust1/3.jpg"
[5]=>
string(30) "url(./Img/images_p/cust1/4.jpg"
}
[1]=>
array(6) {
[0]=>
string(13) "http://images"
[1]=>
string(2) ".."
[2]=>
string(11) "https://Img"
[3]=>
string(0) ""
[4]=>
string(5) "//Img"
[5]=>
string(1) "."
}
[2]=>
array(6) {
[0]=>
string(5) "http:"
[1]=>
string(0) ""
[2]=>
string(6) "https:"
[3]=>
string(0) ""
[4]=>
string(0) ""
[5]=>
string(0) ""
}
[3]=>
array(6) {
[0]=>
string(0) ""
[1]=>
string(0) ""
[2]=>
string(1) "s"
[3]=>
string(0) ""
[4]=>
string(0) ""
[5]=>
string(0) ""
}
[4]=>
array(6) {
[0]=>
string(2) "//"
[1]=>
string(0) ""
[2]=>
string(2) "//"
[3]=>
string(0) ""
[4]=>
string(2) "//"
[5]=>
string(0) ""
}
[5]=>
array(6) {
[0]=>
string(1) "/"
[1]=>
string(1) "/"
[2]=>
string(1) "/"
[3]=>
string(1) "/"
[4]=>
string(1) "/"
[5]=>
string(1) "/"
}
[6]=>
array(6) {
[0]=>
string(9) "ydhlw.jpg"
[1]=>
string(18) "/images/dixian.jpg"
[2]=>
string(20) "images_p/cust1/1.jpg"
[3]=>
string(24) "Img/images_p/cust1/2.jpg"
[4]=>
string(20) "images_p/cust1/3.jpg"
[5]=>
string(24) "Img/images_p/cust1/4.jpg"
}
}
到这里,我们就在用preg_replace来做替换就好了。我们看看代码
$html= preg_replace('/url\(((http(s?)\:)?(\/\/)?[^"\/]*)?(\/)?([^")]*)/iu','url(./${6}',$html);
基本就是对的,唯一的问题就是 ..//替换的时候出错了,但是目前这个..//在网页设计种,还没出现过。或者说这个写法是又问题的,不对的。所以这个特殊情况,我们就不用管了。