在之前的文章《PHP字符串學(xué)習(xí)之怎么去除其他字符,只留下數(shù)字》中,我們介紹了利用for循環(huán)和in_array()或is_numeric()函數(shù)來提取字符串中數(shù)字字符的方法。這次我們繼續(xù)PHP字符串的學(xué)習(xí)與練習(xí),介紹一下提取字符串中數(shù)字字符的另幾種方法。
提取字符串中數(shù)字字符,本質(zhì)上就是字符串過濾操作??吹阶址^濾,我就想起了 “正則表達(dá)式”。
正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對(duì)字符串的一種過濾邏輯。
正則表達(dá)式通過構(gòu)建具有特定規(guī)則的模式,與輸入的字符串信息比較,在特定的函數(shù)中使用從而實(shí)現(xiàn)字符串的匹配、查找、替換及分割等操作。
下面我們看看如何利用正則表達(dá)式來過濾字符串,只提取字符串中的數(shù)字字符,返回由這些數(shù)字字符組成的子串。
例如我們給出下面一個(gè)字符串
$str ='0我是123456一段測試的字789符串0';
想要返回由數(shù)字字符組成的子串“01234567890
”!
方法1、使用preg_replace()函數(shù)
<?php $str ='0我是123456一段測試的字789符串0'; $result = preg_replace("/[^0-9]/", "", $str); echo $result; ?>
分析一下上面的關(guān)鍵代碼:
preg_replace("/[^0-9]/", "", $str)
的意思為匹配除了0~9間的數(shù)字以外的字符,并將這些字符替換為空字符,即刪除這些字符即可。那么就只剩下數(shù)字字符了,因此輸出結(jié)果為:
我們來簡單了解一下preg_replace()函數(shù)
preg_replace() 函數(shù)可以執(zhí)行正則表達(dá)式的搜索和替換,是一個(gè)強(qiáng)大的字符串替換處理函數(shù),該它的語法格式為“preg_replace($pattern, $replacement, $subject [, $limit = -1 [, &$count]])
”,表示搜索 subject 中匹配 pattern 的部分, 以 replacement 進(jìn)行替換;可選參數(shù) limit 用于設(shè)置最大可替換次數(shù)(默認(rèn)值是-1,可無限制)。
方法2:使用preg_match_all()函數(shù)
<?php $str ='0我是123456一段測試的字789符串0'; $result = ''; preg_match_all('/d+/',$str,$array); foreach($array as $arr){ foreach($arr as $value){ $result .= $value; } } echo $result; ?>
分析一下上面的代碼:
preg_match_all('/d+/',$str,$array)
的意思為在字符串$str
中多次查找只包含0~9間數(shù)字字符的子串,將每次的匹配結(jié)果放在一個(gè)數(shù)組$array
中。我們使用var_dump($array)
來輸出這個(gè)數(shù)組看看:
會(huì)發(fā)現(xiàn)結(jié)果數(shù)組$array
是一個(gè)二維數(shù)組,包含匹配結(jié)果的元素是內(nèi)層的數(shù)組。而想要將這些元素拼接成一個(gè)字符串,就需要嵌套兩層foreach循環(huán):
-
第一層循環(huán)中
foreach($array as $arr){ }
-
將內(nèi)層數(shù)組作為值賦給
$arr
,所以在第二層循環(huán)中需要遍歷的數(shù)組變成了$arr
foreach($arr as $value){ $result .= $value; }
-
在每次循環(huán)中,將數(shù)組值賦給變量$value,然后使用“
.=
”運(yùn)算符拼接到字符串$result
中,因此一開始$result
需要為空字符串。
輸出結(jié)果為:
我們來簡單了解一下preg_match_all()函數(shù)。
preg_match_all()函數(shù)可以搜索字符串中所有可以和正則表達(dá)式匹配的結(jié)果,是一個(gè)執(zhí)行全局正則表達(dá)式匹配的函數(shù),它的語法格式為
preg_match_all($pattern, $subject [, &$matches [, $flags = PREG_PATTERN_ORDER [, $offset = 0 ]]])
-
$pattern 正則表達(dá)式
-
$subject 進(jìn)行匹配的字符串
-
$matches 所有匹配結(jié)果(數(shù)組)
preg_match_all() 將實(shí)現(xiàn)全部結(jié)果的匹配,如果想要匹配成功一次后停止匹配,需要使用 preg_match() 函數(shù)。
好了就說到這里了,有其他想知道的,可以點(diǎn)擊這個(gè)哦?!?→php視頻教程
最后給大家推薦閱讀一個(gè)經(jīng)典課程《PHP字符串處理(玉女心經(jīng)版)》,免費(fèi)的~快來學(xué)習(xí)?。?/p>