php的正則處理函數(shù)總結分析
Jun 13, 2016 pm 12:28 PM
preg_grep
(PHP?4,?PHP?5)
preg_grep?--???返回與模式匹配的數(shù)組單元?
說明
array?preg_grep?(?string?pattern,?array?input?[,?int?flags]?)
preg_grep()?返回一個數(shù)組,其中包括了?input?數(shù)組中與給定的?pattern?模式相匹配的單元。?
flags?可以是以下標記:?
PREG_GREP_INVERT?
如果傳遞入此標記,preg_grep()?會返回輸入數(shù)組中不匹配給定?pattern?的單元。本標記自?PHP?4.2.0?起可用。?
自?PHP?4.0.4?起,preg_grep()?返回的結果使用從輸入數(shù)組來的鍵名進行索引。如果不希望這樣的結果,用?array_values()?對?preg_grep()?返回的結果重新索引。?
上面是手冊上對preg_grep()的說明。首先這是perl兼容的正則函數(shù),所以我猜想preg_grep的意思是p(perl)reg(regular)_grep,其特點是可做用于數(shù)組,通過自己擴展,可用做多維數(shù)組中的正則匹配,并且可以通過flags參數(shù)返回匹配或者非匹配數(shù)組。其效率比用foreach(...){if...}結構快很多(未驗證),而且可匹配復雜模式。在搜索、分檢等應用中用途不小。
例:
$arr?=?array('abc'=>12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
//?返回所有含有浮點數(shù)的數(shù)組元素。
$fl_array?=?preg_grep?("/^(\d+)?\.\d+$/",?$arr);
print_r($fl_array);
?>
preg_match
(PHP?3?>=?3.0.9,?PHP?4,?PHP?5)
preg_match?--?進行正則表達式匹配
說明
int?preg_match?(?string?pattern,?string?subject?[,?array?matches?[,?int?flags]]?)
在?subject?字符串中搜索與?pattern?給出的正則表達式相匹配的內(nèi)容。?
如果提供了?matches,則其會被搜索的結果所填充。$matches[0]?將包含與整個模式匹配的文本,$matches[1]?將包含與第一個捕獲的括號中的子模式所匹配的文本,以此類推。?
flags?可以是下列標記:?
PREG_OFFSET_CAPTURE?
如果設定本標記,對每個出現(xiàn)的匹配結果也同時返回其附屬的字符串偏移量。注意這改變了返回的數(shù)組的值,使其中的每個單元也是一個數(shù)組,其中第一項為匹配字符串,第二項為其偏移量。本標記自?PHP?4.3.0?起可用。?
flags?參數(shù)自?PHP?4.3.0?起可用。?
preg_match()?返回?pattern?所匹配的次數(shù)。要么是?0?次(沒有匹配)或?1?次,因為?preg_match()?在第一次匹配之后將停止搜索。preg_match_all()?則相反,會一直搜索到?subject?的結尾處。如果出錯?preg_match()?返回?FALSE。?
提示:?如果只想查看一個字符串是否包含在另一個字符串中,不要用?preg_match()。可以用?strpos()?或?strstr()?替代,要快得多。?
上面是手冊里對preg_match()的說明,我認為這個函數(shù)的功用在于他可做來做驗證,也就是某字符串是否符合某特定要求。其局限是上面所說的要么匹配0次,要么1次。并且返回值是匹配次數(shù)。當需要全匹配時可使用preg_match_all().另外值得一提的是$matches數(shù)組的作用,可做自模式的返回值,有時很有用。
例:
if?(preg_match?("/(\bweb\b)\s(\d)/i",?"PHP?is?the?web?45?scripting?web?34?language?of?choice.",$match))?{
?????print?"A?match?was?found.";
print_r($match);
}?else?{
?????print?"A?match?was?not?found.";
}
?>
//?從?URL?中取得主機名
preg_match("/^(http:\/\/)?([^\/]+)/i",
?????"http://www.php.net/index.html",?$matches);
$host?=?$matches[2];
//?從主機名中取得后面兩段
preg_match("/[^\.\/]+\.[^\.\/]+$/",?$host,?$matches);
echo?"domain?name?is:?{$matches[0]}\n";
?>?
preg_match_all
(PHP?3?>=?3.0.9,?PHP?4,?PHP?5)
preg_match_all?--?進行全局正則表達式匹配
手冊上該函數(shù)的解釋非常明確,就不多做說明了。
說明
int?preg_match_all?(?string?pattern,?string?subject,?array?matches?[,?int?flags]?)
在?subject?中搜索所有與?pattern?給出的正則表達式匹配的內(nèi)容并將結果以?flags?指定的順序放到?matches?中。?
搜索到第一個匹配項之后,接下來的搜索從上一個匹配項末尾開始。?
flags?可以是下列標記的組合(注意把?PREG_PATTERN_ORDER?和?PREG_SET_ORDER?合起來用沒有意義):?
PREG_PATTERN_ORDER?
對結果排序使?$matches[0]?為全部模式匹配的數(shù)組,$matches[1]?為第一個括號中的子模式所匹配的字符串組成的數(shù)組,以此類推。?
preg_match_all?("|]+>(.*)[^>]+>|U",
?????"example:?
?????$out,?PREG_PATTERN_ORDER);
print?$out[0][0].",?".$out[0][1]."\n";
print?$out[1][0].",?".$out[1][1]."\n";
?>??
本例將輸出:?
example:?,?
example:?,?this?is?a?test
因此,$out[0]?包含匹配整個模式的字符串,$out[1]?包含一對?HTML?標記之間的字符串。?
PREG_SET_ORDER?
對結果排序使?$matches[0]?為第一組匹配項的數(shù)組,$matches[1]?為第二組匹配項的數(shù)組,以此類推。?
preg_match_all?("|]+>(.*)[^>]+>|U",
?????"example:?
?????$out,?PREG_SET_ORDER);
print?$out[0][0].",?".$out[0][1]."\n";
print?$out[1][0].",?".$out[1][1]."\n";
?>??
本例將輸出:?
example:?,?example:
本例中,$matches[0]?是第一組匹配結果,$matches[0][0]?包含匹配整個模式的文本,$matches[0][1]?包含匹配第一個子模式的文本,以此類推。同樣,$matches[1]?是第二組匹配結果,等等。?
PREG_OFFSET_CAPTURE?
如果設定本標記,對每個出現(xiàn)的匹配結果也同時返回其附屬的字符串偏移量。注意這改變了返回的數(shù)組的值,使其中的每個單元也是一個數(shù)組,其中第一項為匹配字符串,第二項為其在?subject?中的偏移量。本標記自?PHP?4.3.0?起可用。?
如果沒有給出標記,則假定為?PREG_PATTERN_ORDER。?
返回整個模式匹配的次數(shù)(可能為零),如果出錯返回?FALSE。?
例子?1.?從某文本中取得所有的電話號碼
preg_match_all?("/\(????(\d{3})????\)????(?(1)???[\-\s]?)?\d{3}-\d{4}/x",
?????????????????"Call?555-1212?or?1-800-555-1212",?$phones);
?>??
例子?2.?搜索匹配的?HTML?標記(greedy)
//?\\2?是一個逆向引用的例子,其在?PCRE?中的含義是
//?必須匹配正則表達式本身中第二組括號內(nèi)的內(nèi)容,本例中
//?就是?([\w]+)。因為字符串在雙引號中,所以需要
//?多加一個反斜線。
$html?=?"bold?textclick?me";
preg_match_all?("/(]*>)(.*)()/",?$html,?$matches);
for?($i=0;?$i???echo?"matched:?".$matches[0][$i]."\n";
???echo?"part?1:?".$matches[1][$i]."\n";
???echo?"part?2:?".$matches[3][$i]."\n";
???echo?"part?3:?".$matches[4][$i]."\n\n";
}
?>??
preg_quote
(PHP?3?>=?3.0.9,?PHP?4,?PHP?5)
preg_quote?--?轉義正則表達式字符
說明
string?preg_quote?(?string?str?[,?string?delimiter]?)
preg_quote()?以?str?為參數(shù)并給其中每個屬于正則表達式語法的字符前面加上一個反斜線。如果你需要以動態(tài)生成的字符串作為模式去匹配則可以用此函數(shù)轉義其中可能包含的特殊字符。?
如果提供了可選參數(shù)?delimiter,該字符也將被轉義??梢杂脕磙D義?PCRE?函數(shù)所需要的定界符,最常用的定界符是斜線?/。?
正則表達式的特殊字符包括:.?\?+?*???[?^?]?$?(?)?{?}?=?!??|?:。?
注:?本函數(shù)可安全用于二進制對象。
上面是手冊上的解釋,也很明白,不多說了,另外手冊上還有一注釋就是該函數(shù)可安全用于二進制對象,這點很有用。
例:?例子?1.?preg_quote()?例子
$keywords?=?'$40?for?a?g3/400';
$keywords?=?preg_quote($keywords,?'/');
echo?$keywords;?//?returns?\$40?for?a?g3\/400
?>??
例子?2.?給某文本中的一個單詞加上斜體標記
//?本例中,preg_quote($word)?用來使星號不在正則表達式中
//?具有特殊含義。
$textbody?=?"This?book?is?*very*?difficult?to?find.";
$word?=?"*very*";
$textbody?=?preg_replace?("/".preg_quote($word)."/",
???????????????????????????"".$word."",
???????????????????????????$textbody);
?>??
接下來就是應用超靈活、、功能超強大、使用超廣泛的preg_replace函數(shù)。
preg_replace
(PHP?3?>=?3.0.9,?PHP?4,?PHP?5)
preg_replace?--?執(zhí)行正則表達式的搜索和替換
說明
mixed?preg_replace?(?mixed?pattern,?mixed?replacement,?mixed?subject?[,?int?limit]?)
在?subject?中搜索?pattern?模式的匹配項并替換為?replacement。如果指定了?limit,則僅替換?limit?個匹配,如果省略?limit?或者其值為?-1,則所有的匹配項都會被替換。?
replacement?可以包含?\\n?形式或(自?PHP?4.0.4?起)$n?形式的逆向引用,首選使用后者。每個此種引用將被替換為與第?n?個被捕獲的括號內(nèi)的子模式所匹配的文本。n?可以從?0?到?99,其中?\\0?或?$0?指的是被整個模式所匹配的文本。對左圓括號從左到右計數(shù)(從?1?開始)以取得子模式的數(shù)目。?
對替換模式在一個逆向引用后面緊接著一個數(shù)字時(即:緊接在一個匹配的模式后面的數(shù)字),不能使用熟悉的?\\1?符號來表示逆向引用。舉例說?\\11,將會使?preg_replace()?搞不清楚是想要一個?\\1?的逆向引用后面跟著一個數(shù)字?1?還是一個?\\11?的逆向引用。本例中的解決方法是使用?\${1}1。這會形成一個隔離的?$1?逆向引用,而使另一個?1?只是單純的文字。?
如果搜索到匹配項,則會返回被替換后的?subject,否則返回原來不變的?subject。?
preg_replace()?的每個參數(shù)(除了?limit)都可以是一個數(shù)組。如果?pattern?和?replacement?都是數(shù)組,將以其鍵名在數(shù)組中出現(xiàn)的順序來進行處理。這不一定和索引的數(shù)字順序相同。如果使用索引來標識哪個?pattern?將被哪個?replacement?來替換,應該在調(diào)用?preg_replace()?之前用?ksort()?對數(shù)組進行排序。?
如果?subject?是個數(shù)組,則會對?subject?中的每個項目執(zhí)行搜索和替換,并返回一個數(shù)組。?
如果?pattern?和?replacement?都是數(shù)組,則?preg_replace()?會依次從中分別取出值來對?subject?進行搜索和替換。如果?replacement?中的值比?pattern?中的少,則用空字符串作為余下的替換值。如果?pattern?是數(shù)組而?replacement?是字符串,則對?pattern?中的每個值都用此字符串作為替換值。反過來則沒有意義了。?
/e?修正符使?preg_replace()?將?replacement?參數(shù)當作?PHP?代碼(在適當?shù)哪嫦蛞锰鎿Q完之后)。提示:要確保?replacement?構成一個合法的?PHP?代碼字符串,否則?PHP?會在報告在包含?preg_replace()?的行中出現(xiàn)語法解析錯誤。?
注:?limit?參數(shù)是?PHP?4.0.1pl2?之后加入的。?
我認為其強大之處就是他不但可以處理字符串,而且可以處理數(shù)組,并且他的逆向引用功能非常靈活。基本上他可以滿足普通用戶的大部分需求,如果他不能勝任,那么我們還有preg_replace_callback()函數(shù),可以自定義回調(diào)函數(shù),滿足你的高級要求。如設計過濾器等。
preg_replace_callback
(PHP?4?>=?4.0.5,?PHP?5)
preg_replace_callback?--?用回調(diào)函數(shù)執(zhí)行正則表達式的搜索和替換
說明
mixed?preg_replace_callback?(?mixed?pattern,?callback?callback,?mixed?subject?[,?int?limit]?)
本函數(shù)的行為幾乎和?preg_replace()?一樣,除了不是提供一個?replacement?參數(shù),而是指定一個?callback?函數(shù)。該函數(shù)將以目標字符串中的匹配數(shù)組作為輸入?yún)?shù),并返回用于替換的字符串。?
例子?1.?preg_replace_callback()?例子
???//?此文本是用于?2002?年的,
???//?現(xiàn)在想使其能用于?2003?年
???$text?=?"April?fools?day?is?04/01/2002\n";
???$text.=?"Last?christmas?was?12/24/2001\n";
???//?回調(diào)函數(shù)
???function?next_year($matches)?{
?????//?通常:$matches[0]?是完整的匹配項
?????//?$matches[1]?是第一個括號中的子模式的匹配項
?????//?以此類推
?????return?$matches[1].($matches[2]+1);
???}
???echo?preg_replace_callback(
???????????????"|(\d{2}/\d{2}/)(\d{4})|",
???????????????"next_year",
???????????????$text);
???//?結果為:
???//?April?fools?day?is?04/01/2003
???//?Last?christmas?was?12/24/2002
?>??
You'll?often?need?the?callback?function?for?a?preg_replace_callback()?in?just?one?place.?In?this?case?you?can?use?create_function()?to?declare?an?anonymous?function?as?callback?within?the?call?to?preg_replace_callback().?By?doing?it?this?way?you?have?all?information?for?the?call?in?one?place?and?do?not?clutter?the?function?namespace?with?a?callback?functions?name?not?used?anywhere?else.?
對于使用preg_replace_callback()函數(shù)的朋友來說,你應該回需要callback函數(shù)(否則用他干嘛,直接用preg_replace不是更好),不過也經(jīng)常只是用一處。既然這樣你可以用create_function()來聲明一個匿名函數(shù)作為preg_replace_callback()的回調(diào)函數(shù)。這樣,我們即滿足了聲明信息的需要,有不致因這個不會再用到的函數(shù)名而混亂。
例子?2.?preg_replace_callback()?和?create_function()
???/*?一個?UNIX?風格的命令行過濾器,將每個段落開頭的
???*?大寫字母轉換成小寫字母?*/
???$fp?=?fopen("php://stdin",?"r")?or?die("can't?read?stdin");
???while?(!feof($fp))?{
???????$line?=?fgets($fp);
???????$line?=?preg_replace_callback(
???????????'|
\s*\w|',
???????????create_function(
???????????????//?這里使用單引號很關鍵,
???????????????//?否則就把所有的?$?換成?\$
???????????????'$matches',
???????????????'return?strtolower($matches[0]);'
???????????),
???????????$line
???????);
???????echo?$line;
???}
???fclose($fp);
?>??
最后是
preg_split
(PHP?3?>=?3.0.9,?PHP?4,?PHP?5)
preg_split?--?用正則表達式分割字符串
不再贅述。
說明
array?preg_split?(?string?pattern,?string?subject?[,?int?limit?[,?int?flags]]?)
返回一個數(shù)組,包含?subject?中沿著與?pattern?匹配的邊界所分割的子串。?
如果指定了?limit,則最多返回?limit?個子串,如果?limit?是?-1,則意味著沒有限制,可以用來繼續(xù)指定可選參數(shù)?flags。?
flags?可以是下列標記的任意組合(用按位或運算符?|?組合):?
PREG_SPLIT_NO_EMPTY?
如果設定了本標記,則?preg_split()?只返回非空的成分。?
PREG_SPLIT_DELIM_CAPTURE?
如果設定了本標記,定界符模式中的括號表達式也會被捕獲并返回。本標記添加于?PHP?4.0.5。?
PREG_SPLIT_OFFSET_CAPTURE?
如果設定了本標記,如果設定本標記,對每個出現(xiàn)的匹配結果也同時返回其附屬的字符串偏移量。注意這改變了返回的數(shù)組的值,使其中的每個單元也是一個數(shù)組,其中第一項為匹配字符串,第二項為其在?subject?中的偏移量。本標記自?PHP?4.3.0?起可用。?
提示:?如果不需要正則表達式的功能,可以選擇使用更快(也更簡單)的替代函數(shù)如?explode()?或?str_split()。??

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

用戶語音輸入通過前端JavaScript的MediaRecorderAPI捕獲並發(fā)送至PHP後端;2.PHP將音頻保存為臨時文件後調(diào)用STTAPI(如Google或百度語音識別)轉換為文本;3.PHP將文本發(fā)送至AI服務(如OpenAIGPT)獲取智能回復;4.PHP再調(diào)用TTSAPI(如百度或Google語音合成)將回復轉為語音文件;5.PHP將語音文件流式返回前端播放,完成交互。整個流程由PHP主導數(shù)據(jù)流轉與錯誤處理,確保各環(huán)節(jié)無縫銜接。

在PHP中搭建社交分享功能的核心方法是通過動態(tài)生成符合各平臺要求的分享鏈接。 1.首先獲取當前頁面或指定的URL及文章信息;2.使用urlencode對參數(shù)進行編碼;3.根據(jù)各平臺協(xié)議拼接生成分享鏈接;4.在前端展示鏈接供用戶點擊分享;5.動態(tài)生成頁面OG標籤優(yōu)化分享內(nèi)容展示;6.務必對用戶輸入進行轉義以防止XSS攻擊。該方法無需複雜認證,維護成本低,適用於大多數(shù)內(nèi)容分享需求。

要實現(xiàn)PHP結合AI進行文本糾錯與語法優(yōu)化,需按以下步驟操作:1.選擇適合的AI模型或API,如百度、騰訊API或開源NLP庫;2.通過PHP的curl或Guzzle調(diào)用API並處理返回結果;3.在應用中展示糾錯信息並允許用戶選擇是否採納;4.使用php-l和PHP_CodeSniffer進行語法檢測與代碼優(yōu)化;5.持續(xù)收集反饋並更新模型或規(guī)則以提升效果。選擇AIAPI時應重點評估準確率、響應速度、價格及對PHP的支持。代碼優(yōu)化應遵循PSR規(guī)範、合理使用緩存、避免循環(huán)查詢、定期審查代碼,並藉助X

1.評論系統(tǒng)商業(yè)價值最大化需結合原生廣告精準投放、用戶付費增值服務(如上傳圖片、評論置頂)、基於評論質(zhì)量的影響力激勵機制及合規(guī)匿名數(shù)據(jù)洞察變現(xiàn);2.審核策略應採用前置審核 動態(tài)關鍵詞過濾 用戶舉報機制組合,輔以評論質(zhì)量評分實現(xiàn)內(nèi)容分級曝光;3.防刷需構建多層防禦:reCAPTCHAv3無感驗證、Honeypot蜜罐字段識別機器人、IP與時間戳頻率限制阻止灌水、內(nèi)容模式識別標記可疑評論,持續(xù)迭代應對攻擊。

PHP通過數(shù)據(jù)庫事務與FORUPDATE行鎖確保庫存扣減原子性,防止高並發(fā)超賣;2.多平臺庫存一致性需依賴中心化管理與事件驅動同步,結合API/Webhook通知及消息隊列保障數(shù)據(jù)可靠傳遞;3.報警機制應分場景設置低庫存、零/負庫存、滯銷、補貨週期和異常波動策略,並按緊急程度選擇釘釘、短信或郵件通知責任人,且報警信息需完整明確,以實現(xiàn)業(yè)務適配與快速響應。

PHP不直接進行AI圖像處理,而是通過API集成,因為它擅長Web開發(fā)而非計算密集型任務,API集成能實現(xiàn)專業(yè)分工、降低成本、提升效率;2.整合關鍵技術包括使用Guzzle或cURL發(fā)送HTTP請求、JSON數(shù)據(jù)編解碼、API密鑰安全認證、異步隊列處理耗時任務、健壯錯誤處理與重試機制、圖像存儲與展示;3.常見挑戰(zhàn)有API成本失控、生成結果不可控、用戶體驗差、安全風險和數(shù)據(jù)管理難,應對策略分別為設置用戶配額與緩存、提供prompt指導與多圖選擇、異步通知與進度提示、密鑰環(huán)境變量存儲與內(nèi)容審核、雲(yún)存

PHPisstillrelevantinmodernenterpriseenvironments.1.ModernPHP(7.xand8.x)offersperformancegains,stricttyping,JITcompilation,andmodernsyntax,makingitsuitableforlarge-scaleapplications.2.PHPintegrateseffectivelyinhybridarchitectures,servingasanAPIgateway

選擇合適AI語音識別服務並集成PHPSDK;2.用PHP調(diào)用ffmpeg將錄音轉為API要求格式(如wav);3.上傳文件至雲(yún)存儲並調(diào)用API異步識別;4.解析JSON結果並用NLP技術整理文本;5.生成Word或Markdown文檔完成會議記錄自動化,全過程需確保數(shù)據(jù)加密、訪問控制與合規(guī)性以保障隱私安全。
