本文目錄一覽:
求個正則表達式,驗證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 的形式返回。
返回字元串的類型與給定表達式的類型相同(表中顯示的除外)。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/289454.html