溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在PHP中使用正則表達(dá)式實(shí)現(xiàn)一個(gè)查找替換功能

發(fā)布時(shí)間:2020-12-28 15:36:59 來(lái)源:億速云 閱讀:126 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

怎么在PHP中使用正則表達(dá)式實(shí)現(xiàn)一個(gè)查找替換功能?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

1. preg_match — 執(zhí)行一個(gè)正則表達(dá)式匹配
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜索subject與pattern給定的正則表達(dá)式的一個(gè)匹配.
pattern:
要搜索的模式,字符串類型。
subject :
輸入字符串。
matches:
如果提供了參數(shù)matches,它將被填充為搜索結(jié)果。 $matches[0]將包含完整模式匹配到的文本, $matches[1]將包含第一個(gè)捕獲子組匹配到的文本,以此類推。
flags:
flags可以被設(shè)置為以下標(biāo)記值:PREG_OFFSET_CAPTURE 如果傳遞了這個(gè)標(biāo)記,對(duì)于每一個(gè)出現(xiàn)的匹配返回時(shí)會(huì)附加字符串偏移量(相對(duì)于目標(biāo)字符串的)。 注意:這會(huì)改變填充到matches參數(shù)的數(shù)組,使其每個(gè)元素成為一個(gè)由 第0個(gè)元素是匹配到的字符串,第1個(gè)元素是該匹配字符串 在目標(biāo)字符串subject中的偏移量。
offset:
通常,搜索從目標(biāo)字符串的開(kāi)始位置開(kāi)始??蛇x參數(shù) offset 用于 指定從目標(biāo)字符串的某個(gè)未知開(kāi)始搜索(單位是字節(jié))。
返回值:
preg_match()返回 pattern 的匹配次數(shù)。 它的值將是0次(不匹配)或1次,因?yàn)?preg_match()在第一次匹配后 將會(huì)停止搜索。 preg_match_all()不同于此,它會(huì)一直搜索subject直到到達(dá)結(jié)尾。 如果發(fā)生錯(cuò)誤 preg_match()返回 FALSE。
示例:

復(fù)制代碼 代碼如下:


<?php
/*
&nbsp;*模式分隔符后的"i"標(biāo)記這是一個(gè)大小寫(xiě)不敏感的搜索
&nbsp;*將會(huì)輸出:1
&nbsp;*/
echo preg_match("/,\s*(php)/i", "In my point, PHP is the web scripting language of choice.");
echo "<br/>"."\n";
/*
&nbsp;*將會(huì)輸出:Array([0]=>, PHP [1]=>PHP)&nbsp;
&nbsp;*/
$matches = array();
preg_match("/,\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches);
print_r($matches);
echo "<br/>"."\n";
/*
&nbsp;*將會(huì)輸出:Array([0]=>Array([0]=>, PHP [1]=>11) [1]=>Array([0]=>PHP [1]=>13))&nbsp;
&nbsp;*/
preg_match("/,\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
echo "<br/>"."\n";
/*
&nbsp;*將會(huì)輸出:Array([0]=>Array([0]=>e php [1]=63) [1]=>Array([0]=>php [1]=>65))&nbsp;
&nbsp;*/
preg_match("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_OFFSET_CAPTURE, 28);
print_r($matches);
echo "<br/>"."\n";
?>&nbsp;


2.preg_match_all — 執(zhí)行一個(gè)全局正則表達(dá)式匹配
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
搜索subject中所有匹配pattern給定正則表達(dá)式 的匹配結(jié)果并且將它們以flag指定順序輸出到matches中. 在第一個(gè)匹配找到后, 子序列繼續(xù)從最后一次匹配位置搜索.
pattern:
要搜索的模式,字符串形式。
subject :
輸入字符串。
matches:
多維數(shù)組,作為輸出參數(shù)輸出所有匹配結(jié)果, 數(shù)組排序通過(guò)flags指定。
flags:
可以結(jié)合下面標(biāo)記使用(注意不能同時(shí)使用PREG_PATTERN_ORDER和PREG_SET_ORDER),如果沒(méi)有給定排序標(biāo)記,假定設(shè)置為PREG_PATTERN_ORDER:
PREG_PATTERN_ORDER:
結(jié)果排序?yàn)?matches[0]保存完整模式的所有匹配, $matches[1]保存第一個(gè)子組的所有匹配,以此類推。
PREG_SET_ORDER:
結(jié)果排序?yàn)?matches[0]包含第一次匹配得到的所有匹配(包含子組), $matches[1]是包含第二次匹配到的所有匹配(包含子組)的數(shù)組,以此類推。
PREG_OFFSET_CAPTURE:
如果這個(gè)標(biāo)記被傳遞,每個(gè)發(fā)現(xiàn)的匹配返回時(shí)會(huì)增加它相對(duì)目標(biāo)字符串的偏移量。 注意這會(huì)改變matches中的每一個(gè)匹配結(jié)果字符串元素,使其 成為一個(gè)第0個(gè)元素為 匹配結(jié)果字符串,第1個(gè)元素為 匹配結(jié)果字符串在subject中的偏移量。
返回值:
返回完整匹配次數(shù)(可能是0),或者如果發(fā)生錯(cuò)誤返回FALSE。
示例:

復(fù)制代碼 代碼如下:


<?php
/*
 *將會(huì)輸出:2
 */
echo preg_match_all("/php/i", "In my point, PHP is the web scripting language of choice. I love php", $matches);
echo "<br/>"."\n";
/*
 *將會(huì)輸出:Array([0]=>, PHP [1]=>PHP) 
 */
$matches = array();
preg_match("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches);
print_r($matches);
echo "<br/>"."\n";
/*
 *將會(huì)輸出:Array([0]=>Array([0]=>, PHP [1]=>e php) [1]=>Array([0]=>PHP [1]=>php)) 
 */
$matches = array();
preg_match_all("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_PATTERN_ORDER);
print_r($matches);
echo "<br/>"."\n";
/*
 *將會(huì)輸出:Array([0]=>Array([0]=>Array([0]=>, PHP [1]=>11) [1]=>Array([0]=>PHP [1]=>13)) [1]=>Array([0]=>Array([0]=>e php [1]=>63) [1]=>Array([0]=>php [1]=>65)))
 */
$matches = array();
preg_match_all("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
print_r($matches);
echo "<br/>"."\n";
/*
 *Array([0]=>Array([0]=>e php [1]=>63) [1]=>Array([0]=>php [1]=>65))
 */
$matches = array();
preg_match_all("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE, 28);
print_r($matches);
echo "<br/>"."\n";
?>


3.preg_split — 通過(guò)一個(gè)正則表達(dá)式分隔字符串
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通過(guò)一個(gè)正則表達(dá)式分隔給定字符串.
pattern:
用于搜索的模式,字符串形式。
subject:
輸入字符串
limit:
如果指定,將限制分隔得到的子串最多只有l(wèi)imit個(gè),返回的最后一個(gè) 子串將包含所有剩余部分。limit值為-1, 0或null時(shí)都代表"不限制", 作為php的標(biāo)準(zhǔn),你可以使用null跳過(guò)對(duì)flags的設(shè)置。
flags:
flags 可以是任何下面標(biāo)記的組合(以位或運(yùn)算 | 組合):
PREG_SPLIT_NO_EMPTY:
如果這個(gè)標(biāo)記被設(shè)置, preg_split() 將進(jìn)返回分隔后的非空部分。
PREG_SPLIT_DELIM_CAPTURE:
如果這個(gè)標(biāo)記設(shè)置了,用于分隔的模式中的括號(hào)表達(dá)式將被捕獲并返回。
PREG_SPLIT_OFFSET_CAPTURE:
如果這個(gè)標(biāo)記被設(shè)置, 對(duì)于每一個(gè)出現(xiàn)的匹配返回時(shí)將會(huì)附加字符串偏移量. 注意:這將會(huì)改變返回?cái)?shù)組中的每一個(gè)元素, 使其每個(gè)元素成為一個(gè)由第0個(gè)元素為分隔后的子串,第1個(gè)元素為該子串在subject中的偏移量組成的數(shù)組。
返回值:
返回一個(gè)使用 pattern 邊界分隔 subject 后得到 的子串組成的數(shù)組。
示例:

復(fù)制代碼 代碼如下:


<?php
/*
 *將會(huì)輸出:
 *Array ( [0] => In my point, [1] => is the web scripting language of choice. I love [2] => )
 */
$matches = array();
print_r(preg_split("/php/i", "In my point, PHP is the web scripting language of choice. I love php"));
echo "<br/>"."\n";
/*
 *將會(huì)輸出:
 *Array ( [0] => In my point, [1] => is the web scripting language of choice. I love php )
 */
$matches = array();
print_r(preg_split("/php/i", "In my point, PHP is the web scripting language of choice. I love php", 2));
echo "<br/>"."\n";
/*
 *將會(huì)輸出:
 *Array ( [0] => In my point, [1] => is the web scripting language of choice. I love )
 */
$matches = array();
print_r(preg_split("/php/i", "In my point, PHP is the web scripting language of choice. I love php", -1, PREG_SPLIT_NO_EMPTY));
echo "<br/>"."\n";
?>


4.preg_quote — 轉(zhuǎn)義正則表達(dá)式字符
string preg_quote ( string $str [, string $delimiter = NULL ] )
preg_quote()需要參數(shù) str 并向其中 每個(gè)正則表達(dá)式語(yǔ)法中的字符前增加一個(gè)反斜線。 這通常用于你有一些運(yùn)行時(shí)字符串 需要作為正則表達(dá)式進(jìn)行匹配的時(shí)候。
正則表達(dá)式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
str:
輸入字符串
delimiter:
如果指定了可選參數(shù) delimiter,它也會(huì)被轉(zhuǎn)義。這通常用于 轉(zhuǎn)義PCRE函數(shù)使用的分隔符。 /是最通用的分隔符。
返回值:
返回轉(zhuǎn)義后的字符串。
示例:

復(fù)制代碼 代碼如下:


<?php
//在這個(gè)例子中,preg_quote($word) 用于保持星號(hào)原文涵義,使其不使用正則表達(dá)式中的特殊語(yǔ)義。
$textbody = "This book is *very* difficult to find.";
$word = "*very*";
$textbody = preg_replace ("/" . preg_quote($word) . "/", "<i>" . $word . "</i>", $textbody);
//將會(huì)輸出This book is <i>*very*</i> difficult to find.
echo htmlspecialchars($textbody);
?>


5.preg_grep — 返回匹配模式的數(shù)組條目
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
返回給定數(shù)組input中與模式pattern匹配的元素組成的數(shù)組.
pattern:
要搜索的模式, 字符串形式.
input:
輸入數(shù)組.
flags:
如果設(shè)置為PREG_GREP_INVERT, 這個(gè)函數(shù)返回輸入數(shù)組中與 給定模式pattern不匹配的元素組成的數(shù)組.
返回值:
返回使用input中key做索引的數(shù)組.
示例:

復(fù)制代碼 代碼如下:


<?php
$array = array("abc", "dd", "123", "123.22", "word123", "33.2", "0.22");
//返回所有包含浮點(diǎn)數(shù)的元素
//輸出:Array ( [3] => 123.22 [5] => 33.2 [6] => 0.22 )
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
print_r($fl_array);
//返回所有包含浮點(diǎn)數(shù)的元素
//輸出:Array ( [0] => abc [1] => dd [2] => 123 [4] => word123 )
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array, PREG_GREP_INVERT);
print_r($fl_array);
?>


6.preg_replace — 執(zhí)行一個(gè)正則表達(dá)式的搜索和替換
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分, 以replacement進(jìn)行替換。
pattern:
要搜索的模式。可以是一個(gè)字符串或字符串?dāng)?shù)組。 可以使用一些PCRE修飾符, 包括'e'(PREG_REPLACE_EVAL),可以為這個(gè)函數(shù)指定。
replacement:
用于替換的字符串或字符串?dāng)?shù)組。如果這個(gè)參數(shù)是一個(gè)字符串,并且pattern是一個(gè)數(shù)組,那么所有的模式都使用這個(gè)字符串進(jìn)行替換。如果pattern和replacement都是數(shù)組,每個(gè)pattern使用replacement中對(duì)應(yīng)的 元素進(jìn)行替換。如果replacement中的元素比pattern中的少, 多出來(lái)的pattern使用空字符串進(jìn)行替換。replacement中可以包含后向引用\\n或(php 4.0.4以上可用)$n,語(yǔ)法上首選后者。 每個(gè) 這樣的引用將被匹配到的第n個(gè)捕獲子組捕獲到的文本替換。 n可以是0-99,\\0和$0代表完整的模式匹配文本。 捕獲子組的序號(hào)計(jì)數(shù)方式為:代表捕獲子組的左括號(hào)從左到右, 從1開(kāi)始數(shù)。如果要在replacement中使用反斜線,必須使用4個(gè)("\\\\",譯注:因?yàn)檫@首先是php的字符串,經(jīng)過(guò)轉(zhuǎn)義后,是兩個(gè),再經(jīng)過(guò) 正則表達(dá)式引擎后才被認(rèn)為是一個(gè)原文反斜線)。
當(dāng)在替換模式下工作并且后向引用后面緊跟著需要是另外一個(gè)數(shù)字(比如:在一個(gè)匹配模式后緊接著增加一個(gè)原文數(shù)字), 不能使用\\1這樣的語(yǔ)法來(lái)描述后向引用。比如, \\11將會(huì)使 preg_replace()不能理解你希望的是一個(gè)\\1后向引用緊跟一個(gè)原文1,還是 一個(gè)\\11后向引用后面不跟任何東西。 這種情況下解決方案是使用${1}1。
這創(chuàng)建了一個(gè)獨(dú)立的$1后向引用, 一個(gè)獨(dú)立的原文1。 當(dāng)使用e修飾符時(shí), 這個(gè)函數(shù)會(huì)轉(zhuǎn)義一些字符(即:'、"、 \ 和 NULL) 然后進(jìn)行后向引用替換。當(dāng)這些完成后請(qǐng)確保后向引用解析完后沒(méi)有單引號(hào)或 雙引號(hào)引起的語(yǔ)法錯(cuò)誤(比如: 'strlen(\'$1\')+strlen("$2")')。確保符合PHP的 字符串語(yǔ)法,并且符合eval語(yǔ)法。因?yàn)樵谕瓿商鎿Q后,
引擎會(huì)將結(jié)果字符串作為php代碼使用eval方式進(jìn)行評(píng)估并將返回值作為最終參與替換的字符串。
subject:
要進(jìn)行搜索和替換的字符串或字符串?dāng)?shù)組。 如果subject是一個(gè)數(shù)組,搜索和替換回在subject的每一個(gè)元素上進(jìn)行, 并且返回值也會(huì)是一個(gè)數(shù)組。
limit:
每個(gè)模式在每個(gè)subject上進(jìn)行替換的最大次數(shù)。默認(rèn)是 -1(無(wú)限)。
count:
如果指定,將會(huì)被填充為完成的替換次數(shù)。
返回值:
如果subject是一個(gè)數(shù)組, preg_replace()返回一個(gè)數(shù)組, 其他情況下返回一個(gè)字符串。 如果匹配被查找到,替換后的subject被返回,其他情況下 返回沒(méi)有改變的 subject。如果發(fā)生錯(cuò)誤,返回 NULL 。
示例:
使用后向引用緊跟數(shù)值原文:

復(fù)制代碼 代碼如下:


<?php
$string = 'April 15, 2003';
/*
 *\w+字符重復(fù)一次或者多次
 *\d+數(shù)字重復(fù)一次或者多次
 *i忽略大小寫(xiě)
 */
$pattern = '/(\w+) (\d+), (\d+)/i';
/*
 *$0 完整的模式匹配文本
 *${1}1 第一個(gè)小括號(hào)中的模式匹配文本并且在后面加1
 *\\3 第三個(gè)小括號(hào)中的模式匹配文本
 */
$replacement = '$0:<br/> ${1}1,\\3';
echo preg_replace($pattern, $replacement, $string);
?>


preg_replace()中使用基于索引的數(shù)組:

復(fù)制代碼 代碼如下:


$string = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
//會(huì)輸出:The bear black slow jumped over the lazy dog.
echo preg_replace($patterns, $replacements, $string);
//對(duì)模式和替換內(nèi)容按key進(jìn)行排序我們可以得到期望的結(jié)果.
ksort($patterns);
ksort($replacements);
//會(huì)輸出:The slow black bear jumped over the lazy dog.
echo preg_replace($patterns, $replacements, $string);


替換一些值:

復(fù)制代碼 代碼如下:


<?php
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
                   '/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
?>


使用修飾符'e':

復(fù)制代碼 代碼如下:


<?php
$html_body = "<p><span>hello</span></p>";
//會(huì)輸出:<P><SPAN>hello</SPAN></P>
echo htmlspecialchars(preg_replace("/(<\/?)(\w+)([^>]*>)/e",
             "'\\1'.strtoupper('\\2').'\\3'",
             $html_body));
?>


剝離空白字符:

復(fù)制代碼 代碼如下:


<?php
$str = 'foo   o';
$str = preg_replace('/\s\s+/', ' ', $str);
// 將會(huì)改變?yōu)?#39;foo o'
echo $str;
?>


使用參數(shù)count:

復(fù)制代碼 代碼如下:


<?php
$count = 0;
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
//等價(jià)于echo preg_replace('/\d|\s/', '', 'xp 4 to', -1 , $count);
echo $count; //3
?>


7.preg_replace_callback — 執(zhí)行一個(gè)正則表達(dá)式搜索并且使用一個(gè)回調(diào)進(jìn)行替換
mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] )
這個(gè)函數(shù)的行為除了 可以指定一個(gè) callback 替代 replacement 進(jìn)行替換 字符串的計(jì)算,其他方面等同于 preg_replace()。
pattern:
要搜索的模式,可以使字符串或一個(gè)字符串?dāng)?shù)組。
callback:
一個(gè)回調(diào)函數(shù),在每次需要替換時(shí)調(diào)用,調(diào)用時(shí)函數(shù)得到的參數(shù)是從subject中匹配到的結(jié)果。回調(diào)函數(shù)返回真正參與替換的字符串。
你可能經(jīng)常會(huì)需要callback函數(shù)而 僅用于 preg_replace_callback()一個(gè)地方的調(diào)用。在這種情況下,你可以使用匿名函數(shù)來(lái)定義一個(gè)匿名函數(shù)作為preg_replace_callback()調(diào)用時(shí)的回調(diào)。 這樣做你可以保留所有 調(diào)用信息在同一個(gè)位置并且不會(huì)因?yàn)橐粋€(gè)不在任何其他地方使用的回調(diào)函數(shù)名稱而污染函數(shù)名稱空間。
subject:
要搜索替換的目標(biāo)字符串或字符串?dāng)?shù)組。
limit:
對(duì)于每個(gè)模式用于每個(gè) subject 字符串的最大可替換次數(shù)。 默認(rèn)是-1(無(wú)限制)。
count:
如果指定,這個(gè)變量將被填充為替換執(zhí)行的次數(shù)。
示例:
preg_replace_callback() 和 create_function():

復(fù)制代碼 代碼如下:


<?php
// 將文本中的年份增加一年.
$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]是第一個(gè)捕獲子組的匹配
  // 以此類推
  return $matches[1].($matches[2]+1);
}
/**
 *將會(huì)輸出:
 *April fools day is 04/01/2003
 *Last christmas was 12/24/2002
 */
echo preg_replace_callback(
            "|(\d{2}/\d{2}/)(\d{4})|",
            "next_year",
            $text);
//使用create_function
echo preg_replace_callback(
            "|(\d{2}/\d{2}/)(\d{4})|",
            create_function(
            '$matches',
            'return $matches[1].($matches[2]+1);'
            ),
            $text);
?>

看完上述內(nèi)容,你們掌握怎么在PHP中使用正則表達(dá)式實(shí)現(xiàn)一個(gè)查找替換功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI