代码如下:
<?php
/**
* Hex RGB颜色值互换
* Edit www.
* at 2013/5/11
*/
function HexToRGB($colour) {
if ($colour [0] == '#') {
$colour = substr ( $colour, 1 );
}
if (strlen ( $colour ) == 6) {
list ( $r, $g, $b ) = array (
$colour [0] . $colour [1],
$colour [2] . $colour [3],
$colour [4] . $colour [5]
);
} elseif (strlen ( $colour ) == 3) {
list ( $r, $g, $b ) = array (
$colour [0] . $colour [0],
$colour [1] . $colour [1],
$colour [2] . $colour [2]
);
} else {
return false;
}
$r = hexdec ( $r );
$g = hexdec ( $g );
$b = hexdec ( $b );
return array (
'red' => $r,
'green' => $g,
'blue' => $b
);
}
function RGBToHex($rgb) {
$regexp = "/^rgb\(([0-9]{0,3})\,\s*([0-9]{0,3})\,\s*([0-9]{0,3})\)/";
$re = preg_match ( $regexp, $rgb, $match );
$re = array_shift ( $match );
$hexColor = "#";
$hex = array (
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'A',
'B',
'C',
'D',
'E',
'F'
);
for($i = 0; $i < 3; $i ++) {
$r = null;
$c = $match [$i];
$hexAr = array ();
while ( $c > 16 ) {
$r = $c % 16;
$c = ($c / 16) >> 0;
array_push ( $hexAr, $hex [$r] );
}
array_push ( $hexAr, $hex [$c] );
$ret = array_reverse ( $hexAr );
$item = implode ( '', $ret );
$item = str_pad ( $item, 2, '0', STR_PAD_LEFT );
$hexColor .= $item;
}
return $hexColor;
}
//调用示例
echo implode ( ",", HexToRGB ( "#F7F7DA" ) ) . "<br/>";
echo RGBToHex ( "rgb(247,247,218)" );
?>
php匹配网址的正则,几乎可以匹配任何网址:
])+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9]
[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$
够牛吧,不知道性能如何呢?!
来看一个例子吧。
/**
*匹配任何网址的正则表达式
*www. at 20130509
*/
function IsURL(/blog_article/urlString/index.html)
{
regExp = /^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*[\.。
])+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9]
[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$/
if (urlString.match(regExp))
return "is a url";
else
return "not a url";
}
url = "";
alert(IsURL(/blog_article/url/index.html));
</script>
有兴趣的朋友,可以找个软件,测试下这段代码的性能。
再好的正则,如何性能太差,也是不建议使用的哦。
您可能感兴趣的文章:
php匹配图片地址的代码一例
PHP正则匹配日期和时间(时间戳转换)的例子
php正则匹配重写html图片img路径的代码一例
PHP正则匹配获取URL中域名的代码
使用 preg_replace 函数 匹配图片并加上链接的方法
php用preg_match_all匹配文章中的图片
php正则表达式匹配URL中的域名
php静态类
静态类指的是无需实例化成对象,直接通过静态方式调用的类。
例子,
<?php
class Math
{
public static function ceil($value)
{
return ceil($value);
}
public static function floor($value)
{
return floor($value);
}
}
?>
此时类所扮演的角色更像是命名空间,这或许是很多人喜欢使用静态类最直接的原因。
静态类的问题
本质上讲,静态类是面向过程的,因为通常它只是机械的把原本面向过程的代码集合到一起,虽然结果是以类的方式存在,但此时的类更像是一件皇帝的新衣,所以可以说静态类实际上是披着面向对象的壳儿,干着面向过程的事儿。
面向对象的设计原则之一:针对接口编程,而不是针对实现编程。这有什么不同?打个比方来说:抛开价格因素,你喜欢独立显卡的电脑还是集成显卡的电脑?我想绝大多数人会选择独立显卡。独立显卡可以看做是针对接口编程,而集成显卡就就可以看做是针对实现编程。如此说来针对实现编程的弊端就跃然纸上了:它丧失了变化的可能性。
一个文章管理系统的例子。
<?php
class Article
{
public function save()
{
ArticleDAO::save();
}
}
?>
Article实现必要的领域逻辑,然后把数据持久化交给ArticleDAO去做,而ArticleDAO是一个静态类,就好像焊在主板上的集成显卡一样难以改变,假设我们为了测试代码可能需要Mock掉ArticleDAO的实现,但因为调用时使用的是静态类的名字,等同于已经绑定了具体的实现方式,Mock几乎不可能,当然,实际上有一些方法可以实现:
<?php
class Article
{
private static $dao = 'ArticleDAO';
public static funciton setDao($dao)
{
self::$dao = $dao;
}
public static function save()
{
$dao = self::$dao;
$dao::save();
}
}
?>
有了变量的介入,可以在运行时设定具体使用哪个静态类:
Article::setDao('MockArticleDAO');
Article::save();
?>
虽然这样的实现方式看似解决了Mock的问题,但是首先它修改的原有的代码,违反了开闭原则,其次它引入了静态变量,而静态变量是共享的状态,有可能会干扰其它代码的执行,所以并不是一个完美的解决方案。
补充说明,利用动态语言的特性,其实可以简单的通过require一个不同的类定义文件来实现Mock,但这样做同样有弊端,设想我们在脚本里需要多次变换实现方式,但实际上我们只有一次require的机会,否则就会出现重复定义的错误。
对象的价值
如果放弃静态类,转而使用对象,应该如何实现文章管理系统的例子?
<?php
class Article
{
private $dao;
public function __construct($dao = null)
{
if ($dao === null) {
$dao = new ArticleDAO();
}
$this->setDao($dao);
}
public function setDao($dao)
{
$this->dao = $dao;
}
public function save()
{
$this->dao->save();
}
}
?>
实际上,这里用到了人们常说的依赖注入技术,通过构造器或者Setter注入依赖的对象:
$article = new Article(new MockArticleDAO());
$article->save();
?>
对象有自己的状态,不会发生共享状态干扰其它代码的执行的情况。
关于什么时候用静态类,这个需要在实际的编程中灵活控制,用的不好,反而影响性能。