本文目录一览:
求个正则表达式,验证1个数字,整数10位以内,小数5位以内
暂时研究到这个:
^([-+]?\d{1,10})(\.\d{1,5})?$
请LZ看看是否适合。
说明一下:
[-+]? 匹配正负号
\d{1,10} 匹配1到10位数字
(\.\d{1,5})? 匹配小数,如果有小数点,则必须接1到5位的数字,只有小数点则不匹配
^和$当然就是匹配开始结束了
另外,LZ可以下个RegexTester(正则表达式测试器),很不错的工具
顺表也贴上测试代码吧(PHP)
function check($num) { //检查函数
$reg = '/^([-+]?\d{1,10})(\.\d{1,5})?$/'; //正则表达式
if(preg_match($reg, $num)) {
echo 'the num: ' . $num . ' ---- yes!
';
} else {
echo 'the num: ' . $num . ' ---- no!
';
}
}
$numbers = array( //一些测试数据
1 = -0.14,
2 = +0.14,
3 = 1234567891,
4 = 12345678912,
5 = 123456.123,
6 = 123456,123456,
7 = 1234.,
8 = 0000.12345,
9 = 0.123456
);
array_walk($numbers, 'check'); //对个数组中的每个值执行check函数
比较常用的几个PHP开发工具
1、浏览器扩展组件工具(Firefox扩展)--
FirePHP FirePHP是一款基于Firebug的扩展,phpLangEditor 一款PHP函数库解释工具。 PHP Lookup :是一个内置的搜索栏,以帮助您快速查找引用的PHP语法。 PHP ManualSearch :一个方便的搜索栏,从您的Web浏览器中搜索官方PHP文档。
2、PHP代码调试工具--
Webgrind Webgrind完美支持PHP 5,安装迅速简便,可以跨越多个平台运行。 Xdebug Xdebug是使用极为广泛的PHP代码调试工具,它提供大量的工具帮助你找出程序中潜在的BUG,并且它得到了很多PHP开发工具的支持,以做为专门的测试工具继承在这些开发工具中,比如PHPEclipse、phpDesigner等。
3、PHP框架支持--
Dwoo :PHP5 的模板引擎。CodeIgniter 用于敏捷软件开发的PHP框架。 YII Framework :一个高性能的基于组件的PHP框架。 NetBeans :强大的PHP扩展框架支持集,拥有完善的GUI界面,独自成为一款强大的PHP开发工具。 Solar symfony :一个开源的PHP Web框架,加速Web应用程序开发的创建与维护。
4、PHP代码测试、优化工具--
PHPUnit :一款基于PHP 5的JUnit组件测试工具。 SimpleTest SimpleTest是一款高度集成的PHP代码测试工具。 Selenium :一款专业全自动WEB站点PHP代码测试工具,比较侧重的UI输入输出数据测试。PHP_CodeSniffer dBug 一款专注于测试类、对象、数组以及XML文件的PHP工具。 PHP Profile Class
5、PHP扩展、工具集、类库支持--
SimplePie 此工具可用于PHP RSS解析。 HTML Purifier :此工具可以用来移除所有恶意代码(XSS),而且还能确保你的页面遵循W3C的标准规范。 TCPDF :一个可以用于快速生成PDF文件的PHP5函数包。 htmlSQL :一组可以使你方便的对HTML和XML内容方便的使用类似SQL语句进行检索的PHP类集。
6、PHP集成开发环境(IDE)、编辑器--
PHPEclipse 一个强大的Eclipse环境下开发PHP的插件,包括的主要功能有:PHP语法分析,调试,代码格式化,大纲视图,代码模板定制等。 PhpED 一套Windows环境下的PHP集成开发环境。phpDesigner 一款轻量级的PHP集成开发工具,代码编辑器功能特别强大,支持在线预览。 ZendStudio 一 款Eclipse下优秀的PHP开发环境,适用于开发包含丰富接口的RIAs应用程序。
7、PHP在线工具及资源--
Minify:该工具使用 PHP5 开发,用于合并压缩js/css 文件的应用程序,合并压缩之后的结果可通过 HTTP gzip/deflate 及一些相关头,优化客户端缓存。 HTTP_StaticMerger:CSS和java script文件自动"合并"。 PHP Object Generator 一款PHP代码生成器,它能够为你的PHP4/PHP5应用程序生成简洁和可测试的面向对象代码。
调用MYSQL 删除HTML代码并限制长度
public static function filter_newslink($aid){
$content = mod_news :: get_newscont($aid);
//先过滤图片的外链 非贪婪匹配 普通正则用?,PHP用/U转变是否贪婪
$content = preg_replace('/a([^]*)(img[^]*)\/a/iU', '$2', $content);
//再过滤文字的外链a title="" href=""文字/a为文字
$content = preg_replace('/a([^]*)([^]*)\/a/iU', '$2', $content);
$data = array('news_id' = $aid, "content" = $content);
$status = mod_news :: update_newscontent($data);
return $status;
}
贪婪匹配(Greedy)是最大匹配,例如对于html字符串:
nowamagic.net is a bgood/b website to blearn/b IT bskills/c.
通过正则b.*/b 默认匹配的结果为:
bgood/b website to blearn/b
但许多情况下我们想要的其实是bgood/b 和 blearn/b 两个匹配
解决的办法,就是上面说到的非贪婪匹配,即惰性匹配,它的语法如下表所示:
贪婪匹配 惰性匹配 匹配描述
? ?? 匹配 0 个或 1 个
+ +? 匹配 1 个或多个
* *? 匹配 0 个或多个
{n} {n}? 匹配 n 个
{n,m} {n,m}? 匹配 n 个或 m 个
{n,} {n,}? 匹配 n 个或多个
上述例子使用非贪婪匹配b.*?/b 得到的结果为两个匹配,这次符合我们的需要了。
PHP正则表达式模式修正符:
i 正则内容在匹配时候不区分大小写(默认是区分的)
m 在匹配首内容或者尾内容时候采用多行识别匹配
S 将转义回车取消是为单行匹配如. 匹配的时候
x 忽略正则中的空白
A 强制从头开始匹配
D 强制$匹配尾部无任何内容 \n
U 禁止贪婪匹配 只跟踪到最近的一个匹配符并结束,常用在采集程序上的正则表达式
这里是一个正则匹配的在线匹配测试工具:
替换文章的关键词标签可以使用MySQL导出后加工再导入数据库,也可以使用存储过程实现。这个的存储过程简单写一下:
[sql] view plain copy
delimiter //
create procedure replaceAllTag()
begin
declare i INT;
while i =20 do
select replace(tag,",i,",",COSTi,") FROM `TBL_CMS_NEWS_bak` WHERE `col_id_related`=661 and tag like "%,i,%";
set i=i+1;
end while;
end //
delimiter ;
在PhpMyAdmin中,drop procedure replaceAllTag 需要单独执行,否则会报错。存储过程的语法请参照以下实例:
[sql] view plain copy
delimiter //
CREATE PROCEDURE `dadada` ()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
WHILE x = 5 DO
SET str = CONCAT(str,x,',');
SET x = x + 1;
END WHILE;
SELECT str;
END //
delimiter ;
后来发现有些图片没有抓过来,而产品已经上线,重新抓取数据已是不现实的事情了。于是和同事协商后干脆把图片所在块一起去掉。攻略文章不再展示“卡牌数值”的图片表格。实现方法是采用MySQL的一些不太常用的函数。
[sql] view plain copy
SELECT replace(content,SUBSTRING(content FROM POSITION("卡牌数值" IN content) FOR POSITION("--" IN content)),"/span/h3/div")
as x from CONTENT_TABLE c
where c.news_id in (select news_id from NEWS_TABLE where col_id = 66)
update CONTENT_TABLE c
set c.content = replace(c.content,SUBSTRING(c.content FROM POSITION("卡牌数值" IN c.content) FOR POSITION("--" IN c.content)),"/span/h3/div")
where c.news_id in (select news_id from NEWS_TABLE where col_id = 66)
鉴于抓来的html结构比较乱比较复杂,也只能这样了。尽管效率一般,不过相关的文章不过几百篇,还可以接受的解决方法。关于其中涉及的SQL函数这里再重温学习一下:
一、MySQL中LOCATE和别名函数POSITION等
函数LOCATE(substr,str) 作用同POSITION(substr IN str)和INSTR(str,substr)
作用:返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在,返回值为 0;LOCATE还有一种形式,包含三个参数:LOCATE(substr,str,pos) ,其返回子串 substr 在字符串 str 中的第 pos 位置后第一次出现的位置。INSTR(str,substr)和LOCATE()的双参数形式相同,只是参数顺序不一样而已。
mysql SELECT LOCATE('bar', 'foobarbar');
- 4
mysql SELECT INSTR('foobarbar', 'bar');
- 4
mysql SELECT LOCATE('xbar', 'foobar');
- 0
mysql SELECT INSTR('xbar', 'foobar');
- 0
mysql SELECT LOCATE('bar', 'foobarbar', 7);
- 7
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。
以下语句可以实现同样的查询功能:
SELECT `column` FROM `table` where `condition` like `%keyword%’
SELECT `column` from `table` where locate(‘keyword’, `condition`)0
SELECT `column` from `table` where position(‘keyword’ IN `condition`)
SELECT `column` from `table` where instr(`condition`, ‘keyword’ )0
速度上后三个比使用 like 稍快了一点点。
二、MySQL的REPLACE用法
用法一:函数REPLACE(str,from_str,to_str)
在字符串 str 中所有出现的字符串 from_str 均被 to_str替换,然后返回这个字符串:
mysql select REPLACE('', 'a', 'list');
-
例:把表table中的name字段中的 '斗三国'替换为“全民斗三国”
mysql update table set name=replace(name,'斗三国','全民斗三国')
这个函数也是多字节安全的。
用法二:REPLACE INTO
在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在; 2. 如果不存在,则插入;3.如果存在,则更新。包括我在内的程序猿们常见的做法有三种:
第一种:MySQL很常见的一种做法,许多新手、甚至许多资深的高级coder也有这么写的,会在代码中封装三个函数,一个函数查询记录是否存在,一个函数实现直接插入,另一个函数对已有记录进行更新。在不同的情况进行调用。这种方法多次excute执行数据操作,势必造成比较大的开销。
第二种:用一条SQL代替三种情况的封装,来实现按需操作,或插入新记录,或更新旧数据。SQL Server中的语句如下:
IF NOT EXISTS(select 1 from NEWS_bak where news_id = 1008)
insert into NEWS_bak(title, keyword, description) values('孙权', '三国','孙权-吴国老大')
else
update NEWS_bak set title = '孙权'and keyword='三国' and description='孙权-吴国老大' where news_id = 1008
说明:对于IF NOT EXISTS的相同表达,MySQL一般用作条件WHERE NOT EXISTS();由于exists(SELECT NULL )也会返回true,故select exists(SELECT NULL )的结果为1。
但是在MySQL 中如何实现此逻辑呢?方法有,且语法更简洁——replace into 。
MySQL replace into 有三种形式:
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...
3. replace into tbl_name set col_name=value, ...
前两种形式使用频度比较高。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。所有列的值均取自在REPLACE语句中被指定的值。所有缺失的列被设置为各自的默认值,这和INSERT一样。您不能从当前行中引用值,也不能在新行中使用值。如果您使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。
举例:
replace into tableName (id,index) values('1','index-A'),('2','index-B')
此语句用于向表tableName中插入两条记录。 replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据; 否则,直接插入新的数据。
为了能够使用REPLACE,您必须同时拥有表的INSERT和DELETE权限。
REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。如果对于一个单行REPLACE该数为1,则一行被插入,同时没有行被删除。如果该数大于1,则在新行被插入前,有一个或多个旧行被删除。如果表包含多个唯一索引,并且新行复制了在不同的唯一索引中的不同旧行的值,则有可能是一个单一行替换了多个旧行。
PHP可以使用mysql_affected_rows()函数获得受影响的行数。受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:只需检查该数是否为1(添加)或更大(替换)。
必须注意:插入数据的表必须有主键PRIMARY KEY或者是唯一索引UNIQUE!否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。这时,replace into 会直接插入数据,这将导致表中出现重复的数据。
三、MySQL SUBSTRING 函数的使用
SUBSTRING ( expression , start , length )
参数:
expression 是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。
start是一个整数,指定子串的开始位置。若为负数,则从字符串末尾倒数。
length是一个整数,可选,指定子串的长度(要返回的字符数或字节数)。
函数共有4种格式:
SUBSTRING(str,pos) ,
SUBSTRING(str FROM pos) ,
SUBSTRING(str,pos,len) ,
SUBSTRING(str FROM pos FOR len)
不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
说明
由于在 text 数据上使用 SUBSTRING 时 start 和 length 指定字节数,因此 DBCS 数据(如日本汉字)可能导致在结果的开始或结束位置拆分字符。此行为与 READTEXT 处理 DBCS 的方式一致。然而,由于偶而会出现奇怪的结果,建议对 DBCS 字符使用 ntext 而非 text 。
返回类型
如果 expression 是支持的字符数据类型,则返回字符数据。如果expression 是支持的 binary 数据类型,则返回二进制数据。一般实际使用中text 数据多以 varchar 的形式返回,image 数据则以 varbinary 的形式返回。
返回字符串的类型与给定表达式的类型相同(表中显示的除外)。