php模糊字元串
❶ php 字元串處理問題
如果沒理解錯,方法如下:
首先有個函數explode(),當然你也可以自己寫拆分函數
第一步,找$來拆分,如果子串等於1,那麼兩邊直接加11,返回結果。如果子串大於1,那麼進行第二步
第二步,重新處理這個字元串,這次找$opda1254來拆分,如果子串等於1,那麼直接返回不處理,如果子串大於1,比如是2,那麼原字元串大概是***+$opda1254+***,那麼拼接時使用$11opda125411連接2個子串即可。
如果子串是多個,同第二步,只不過是原串***+$opda1254+***+$opda1254+***
❷ php如何模糊查詢字元串 - 技術問答
唉,自己搞定了。function checkstr($str){ $needle = \"a\";//判斷是否包含a這個字元 $tmparray = explode($needle,$str); if(count($tmparray)>1){ return true; } else{ return false; } } 到技術吧網站查看回答詳情>>
❸ php中if條件中可不可以用模糊查詢 應該怎麼寫
你說的模糊查詢我可以理解判斷為對象字元串是否包含對比字元串嗎?
stripos()-查找字元串在另一字元串中第一次出現的位置(不區分大小寫)
strpos()返回字元串在另一字元串中第一次出現的位置(對大小寫敏感)。
if(strpos('abc','a')!==false){
echo'包含';
}else{
echo'不包含';
}
❹ PHP模糊替換字元串的問題
用正則表達式吧
下面的就是把 $db_host=???; 替換成 $db_host=123;
$FileCon = preg_replace('/\$db_host[\s]{0,}=[^;]+;/', '$db_host=123;', $FileCon, 1); //替換
若是其它變數只需 把 $db_host換成其它的, $db_host=123; 換成相應的替換字元就行
❺ php+mysql模糊查詢功能
一般模糊查詢語句如下:
SELECT 欄位 FROM 表 WHERE 某欄位 Like 條件
其中關於條件,SQL提供了四種匹配模式:
1,% :表示任意0個或多個字元。可匹配任意類型和長度的字元,有些情況下若是中文,請使用兩個百分號(%%)表示。
比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'
將會把u_name為「張三」,「張貓三」、「三腳貓」,「唐三藏」等等有「三」的記錄全找出來。
另外,如果需要找出u_name中既有「三」又有「貓」的記錄,請使用and條件
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%貓%'
若使用 SELECT * FROM [user] WHERE u_name LIKE '%三%貓%'
雖然能搜索出「三腳貓」,但不能搜索出符合條件的「張貓三」。
2,_ : 表示任意單個字元。匹配單個任意字元,它常用來限製表達式的字元長度語句:
比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找出「唐三藏」這樣u_name為三個字且中間一個字是「三」的;
再比如 SELECT * FROM [user] WHERE u_name LIKE '三__';
只找出「三腳貓」這樣name為三個字且第一個字是「三」的;
3,[ ] :表示括弧內所列字元中的一個(類似正則表達式)。指定一個字元、字元串或范圍,要求所匹配對象為它們中的任一個。
比如 SELECT * FROM [user] WHERE u_name LIKE '[張李王]三'
將找出「張三」、「李三」、「王三」(而不是「張李王三」);
如 [ ] 內有一系列字元(01234、abcde之類的)則可略寫為「0-4」、「a-e」
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
將找出「老1」、「老2」、……、「老9」;
4,[^ ] :表示不在括弧所列之內的單個字元。其取值和 [] 相同,但它要求所匹配對象為指定字元以外的任一個字元。
比如 SELECT * FROM [user] WHERE u_name LIKE '[^張李王]三'
將找出不姓「張」、「李」、「王」的「趙三」、「孫三」等;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
將排除「老1」到「老4」,尋找「老5」、「老6」、……
5,查詢內容包含通配符時
由於通配符的緣故,導致我們查詢特殊字元「%」、「_」、「[」的語句無法正常實現,而把特殊字元用「[ ]」括起便可正常查詢。據此我們寫出以下函數:
function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最前
str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function
❻ 三個下拉菜單如何實現php模糊查詢,各位師兄看看下面的代碼錯在哪裡。。謝了
你的查詢語句查的是並集,難道kecheng,name,city不是同一個表的欄位么?
當然,用你的查詢語句也能查到記錄,但是卻不能做到精確定位一條記錄
如一條記錄:"city"=>"china" ,"name"=>"myname" , "title " => "English"
你的查詢語句這時是:
"select id from kecheng where title like '%English%' or name like '%myname%' or city like '%china%' "
這時查到的記錄,並非只有同時包含『china』、『myname』、『English』,所以你的查詢語句是失敗的。
你應該改成這樣:
$where = " where 1=1";//注意where前面有空格
if($_POST[kecheng])$where .= " AND title like '%$_POST[kecheng]%'";//注意AND前面有空格
if($_POST[name])$where .= " AND name like '%$_POST[name]%'";
if($_POST[city])$where .= " AND city like '%$_POST[city]%'";
$result = mysql_query("select id from kecheng ".$where);
同樣下面的賦值給$query 變數的語句也依照此修改,就能實現模糊查詢,並根據條件精確定位記錄了。
❼ php 怎麼處理字元串
大家通過對PHP的學習,可以運用這一高級語言創建一個性能較高的網站。對於初學者來說,對於PHP字元串mbstring還是比較陌生的,下面我們就來介紹一下PHP字元串mbstring的具體應用。
多國語言並存就意味著多位元組,PHP內置的字元串長度函數strlen無法正確處理中文字元串,它得到的只是字元串所佔的位元組數。對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是1~3倍的差異了。
採用PHP字元串mbstring可以較好地解決這個問題。mb_strlen的用法和strlen類似,只不過它有第二個可選參數用於指定字元編碼。例如得到UTF-8的字元串$str長度,可以用mb_strlen($str,』UTF-8′)。如果省略第二個參數,則會使用PHP的內部編碼。內部編碼可以通過mb_internal_encoding()函數得到,設置有兩種方式:
1. 在php.ini中設置mbstring.internal_encoding = UTF-8
2. 調用mb_internal_encoding(」GBK」)
除了PHP字元串mbstring,還有很多切割函數,其中mb_substr是按字來切分字元,而mb_strcut是按位元組來切分字元,但是都不會產生半個字元的現象。而且從函數切割對長度的作用也不同,mb_strcut的切割條件是小於strlen, mb_substr是等於strlen,看下面的例子,
< ? $str = 『我是一串比較長的中文-www.jefflei.com』; echo 「mb_substr:」 . mb_substr($str, 0, 6, 『utf-8′); echo 」 「; echo 「mb_strcut:」 . mb_strcut($str, 0, 6, 『utf-8′); ?>
輸出如下:
mb_substr:我是一串比較
mb_strcut:我是
需要注意的是,PHP字元串mbstring並不是PHP核心函數,使用前需要確保在php編譯模塊時加入mbstring的支持:
(1)編譯時使用–enable-mbstring
(2)修改/usr/local/lib/php.inc
default_charset = 「zh-cn」
mbstring.language = zh-cn
mbstring.internal_encoding =zh-cn
PHP字元串mbstring類庫內容比較多,還包括mb_ send_ mail 之類的email處理函數等
❽ php中怎麼去掉字元串最後一個字元
使用PHP字元串系列函數trim();
trim去掉兩端的空格,可以帶兩個參數,第一個參數是原字元串,第二個參數是需要消除的字元,默認為空格,如trim("#hello#","#") 就是去掉兩端的"#",如果要去掉某一側的話,可以使用ltrim()去掉左側的字元,rtrim()去掉右側的字元。
$str = "hello#";
echo rtrim($str,"#");
或者可以使用substr來直接進行截取
首先獲取字元串的長度,然後截取到長度-1的位置,如
$str = "hello";
echo substr($str,0,strlen($str)-1);
❾ 幾個有用的php字元串過濾,轉換函數
explode — 使用一個字元串分割另一個字元串
array explode ( string $delimiter , string $string [, int $limit ] )
此函數返回由字元串組成的數組,每個元素都是 string 的一個子串,它們被字元串 delimiter 作為邊界點分割出來。
<?php// 示例 1$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";$pieces = explode(" ", $pizza);echo $pieces[0]; // piece1echo $pieces[1]; // piece2 // 示例 2$data = "foo:*:1023:1000::/home/foo:/bin/sh";list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);echo $user; // fooecho $pass; // * ?>
❿ php+mysql 如何優化千萬級數據模糊查詢加快
關於mysql處理百萬級以上的數據時如何提高其查詢速度的方法
最近一段時間由於工作需要,開始關注針對Mysql資料庫的select查詢語句的相關優化方法。
由於在參與的實際項目中發現當mysql表的數據量達到百萬級時,普通SQL查詢效率呈直線下降,而且如果where中的查詢條件較多時,其查詢速度簡直無法容忍。曾經測試對一個包含400多萬條記錄(有索引)的表執行一條條件查詢,其查詢時間竟然高達40幾秒,相信這么高的查詢延時,任何用戶都會抓狂。因此如何提高sql語句查詢效率,顯得十分重要。以下是網上流傳比較廣泛的30種SQL查詢語句優化方法:
1、應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
2、對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
3、應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
4、盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5、下面的查詢也將導致全表掃描:(不能前置百分號)
select id from t where name like 『%c%』
若要提高效率,可以考慮全文檢索。
6、in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7、如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num
8、應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2
9、應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)=』abc』–name以abc開頭的id
select id from t where datediff(day,createdate,』2005-11-30′)=0–』2005-11-30′生成的id
應改為:
select id from t where name like 『abc%』
select id from t where createdate>=』2005-11-30′ and createdate<』2005-12-1′
10、不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
11、在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使 用,並且應盡可能的讓欄位順序與索引順序相一致。
12、不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(…)
13、很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
14、並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有欄位 sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。
15、索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。
16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那麼需要考慮是否應將該索引建為 clustered 索引。
17、盡量使用數字型欄位,若只含數值信息的欄位盡量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會 逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。
18、盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的欄位內搜索效率顯然要高些。
19、任何地方都不要使用 select * from t ,用具體的欄位列表代替「*」,不要返回用不到的任何欄位。
20、盡量使用表變數來代替臨時表。如果表變數包含大量數據,請注意索引非常有限(只有主鍵索引)。
21、避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。
22、臨時表並不是不可使用,適當地使用它們可以使某些常式更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使 用導出表。
23、在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然後insert。
24、如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。
25、盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫。
26、使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。
27、與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括「合計」的常式通常要比使用游標執行的速度快。如果開發時 間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。
28、在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 消息。
29、盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。
30、盡量避免大事務操作,提高系統並發能力。