當前位置:首頁 » 編程語言 » php文件名正則

php文件名正則

發布時間: 2023-11-28 05:09:19

php中正則問題

首先贊揚一下樓主的提問方式:
1. 對問題描述得很清晰;
2. 給出了匹配的範例文本;
3. 指定了正則式所在的語言。
這才應該是規范合理的提問。

言歸正傳,先根據問題,寫出正則,然後落實到PHP語言。如果對分析過程不感興趣,請直接pagedown看答案。

1. 基礎
需要匹配的關鍵詞為:test,你好,程序,分類。
正則表達式:/test|你好|程序|分類/i
(i是表示大小寫不敏感模式。如果指定匹配小寫的test,則可以去掉i)

2. 限制條件
a. 不在標簽內部,例如<img src=asdasda.jpg alt="test" title="你好">,裡面雖然有test和你好,但這不滿足要求;
b. 本身無鏈接。例如,<a href="link1" alt="程序設計">程序設計</a>中,>程序設計<中的程序由於處於<a..>程序設計</a>之間,同樣不滿足要求。

根據以上限制,寫出純粹的正則式(並不能直接用在php中):
(?<!<(?:a|img)[^<>]*)(test|你好|程序|分類)(?![^<>]*</a>)
它表示,(test|你好|程序|分類)的緊臨左側不能出現<a..標簽,或者<img標簽;緊臨右側不能出現</a>標簽。

「緊臨」二字至關重要,它將無直接關系的<>都忽略掉,才確保條件的正確執行。怎樣實現這一點呢?我使用的是[^<>]*。

正則式的部分這里就交待清楚了。下面將正則式應用到PHP中。

3. php正則式
php使用的正則表達式是PCRE的,它不支持在lookbehind里使用無限量詞,即(?<!<(?:a|img)[^<>]*)部分不被PCRE支持。沒關系,可以修改之。
(?<!(?:<a|<img))([^<>]*)(test|你好|程序|分類)(?![^<>]*(?:>|</a>))

與2中的正則式相比,前者$1即為所求,其餘部分只匹配,不消耗字元;而後者$2為所求,還需要對$1進行處理。

4. php細節
我使用preg_replace_callback函數,以便自定義替換過程。代碼如下,隨手注釋:

<?php

//此處使用heredoc語法,以便支持復雜的長文本。
$x=<<<EOT
請從以下推薦分類中選擇合適的分類:<br>電腦/網路 -> <a href="link1" alt="程序設計">程序設計</a><br>
電腦/網路 -> 操作系統/系統故障<br>
<br>
如果沒有合適的推薦分類,建議您更改分類,有助於獲得准確解答 <br>
<img src=asdasda.jpg alt="test" title="你好"><br>
您還可以輸入1381字<br>
test<br>
輸入內容已經達到長度限制<br>
EOT;

//關鍵詞數組
$a=array(
1 => "test",
2 => "你好",
3 => "程序" ,
4 => "分類"
);

//記號數組,用於記錄哪些匹配是已經替換了的。因為樓主指定「每個詞只匹配一次」。
$index=array();

function compute_replacement($groups) {

global $a;
global $index;

if ($index[$groups[2]])
{
//如果該關鍵詞已經被處理過,那麼直接返回整個字串($groups[0]),不作處理。
return $groups[0];
}

//查詢該關鍵詞在數組中的位置,確定序號,以便生成href="1.html"之類鏈接地址。
$in=array_search($groups[2],$a);

//將處理過的關鍵詞標記為已處理,避免重復。
$index[$groups[2]]=1;

//返回處理好的文本。
return "$groups[1]<a href=\"$in.html\" title=\"$groups[2]\">$groups[2]</a>";
}

$r= preg_replace_callback('%(?<!<)([^<>]*)(test|你好|程序|分類)(?![^<>]*(?:>|</a>))%s', compute_replacement, $x);

echo $r;
?>

輸出的結果為:

請從以下推薦分類中選擇合適的<a href="4.html" title="分類">分類</a>:<br>電腦/網路 -> <a href="link1" alt="程序設計">程序設計</a><br>
電腦/網路 -> 操作系統/系統故障<br>
<br>
如果沒有合適的推薦分類,建議您更改分類,有助於獲得准確解答 <br>

<img src="asdasda.jpg" alt="test" title="你好"><br>
您還可以輸入1381字<br>
<a href="1.html" title="test">test</a><br>
輸入內容已經達到長度限制<br></body>

註:這里的格式不好,建議去「參考資料」所指向的地址察看更易讀版本的解答。

正則表達式論壇:
正則表達式博客:

附:匹配圖。高亮部分為匹配結果。

Ⅱ php 正則表達式

建議你到我的網站上下載PHP5參考手冊,里邊有詳細的正則表達式的參考。
模式要有開始和結束的字元,一下都是合法的:
/
|
#
'
前提是模式中不能再出現這個字元了。
結尾的/後邊的is是模式修政府,具體如下
i (PCRE_CASELESS)
如果設定此修正符,模式中的字元將同時匹配大小寫字母。
m(PCRE_MULTILINE)
默認情況下,PCRE 將目標字元串作為單一的一「行」字元所組成的(甚至其中包含有換行符也是如此)。「行起始」元字元(^)僅僅匹配字元串的起始,「行結束」元字元($)僅僅匹配字元串的結束,或者最後一個字元是換行符時其前面(除非設定了 D 修正符)。這和 Perl 是一樣的。

當設定了此修正符,「行起始」和「行結束」除了匹配整個字元串開頭和結束外,還分別匹配其中的換行符的之後和之前。這和 Perl 的 /m 修正符是等效的。如果目標字元串中沒有「\n」字元或者模式中沒有 ^ 或 $,則設定此修正符沒有任何效果。

s(PCRE_DOTALL)
如果設定了此修正符,模式中的圓點元字元(.)匹配所有的字元,包括換行符。沒有此設定的話,則不包括換行符。這和 Perl 的 /s 修正符是等效的。排除字元類例如 [^a] 總是匹配換行符的,無論是否設定了此修正符。
x(PCRE_EXTENDED)
如果設定了此修正符,模式中的空白字元除了被轉義的或在字元類中的以外完全被忽略,在未轉義的字元類之外的 # 以及下一個換行符之間的所有字元,包括兩頭,也都被忽略。這和 Perl 的 /x 修正符是等效的,使得可以在復雜的模式中加入注釋。然而注意,這僅適用於數據字元。空白字元可能永遠不會出現於模式中的特殊字元序列,例如引入條件子模式的序列 (?( 中間。
e
如果設定了此修正符,preg_replace() 在替換字元串中對逆向引用作正常的替換,將其作為 PHP 代碼求值,並用其結果來替換所搜索的字元串。

只有 preg_replace() 使用此修正符,其它 PCRE 函數將忽略之。

注意: 本修正符在 PHP3 中不可用。

A(PCRE_ANCHORED)
如果設定了此修正符,模式被強制為「anchored」,即強制僅從目標字元串的開頭開始匹配。此效果也可以通過適當的模式本身來實現(在 Perl 中實現的唯一方法)。
D(PCRE_DOLLAR_ENDONLY)
如果設定了此修正符,模式中的美元元字元僅匹配目標字元串的結尾。沒有此選項時,如果最後一個字元是換行符的話,美元符號也會匹配此字元之前(但不會匹配任何其它換行符之前)。如果設定了 m 修正符則忽略此選項。Perl 中沒有與其等價的修正符。
S
當一個模式將被使用若干次時,為加速匹配起見值得先對其進行分析。如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字元的 non-anchored 模式有用。
U(PCRE_UNGREEDY)
本修正符反轉了匹配數量的值使其不是默認的重復,而變成在後面跟上「?」才變得重復。這和 Perl 不兼容。也可以通過在模式之中設定 (?U) 修正符或者在數量符之後跟一個問號(如 .*?)來啟用此選項。
X(PCRE_EXTRA)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式中的任何反斜線後面跟上一個沒有特殊意義的字母導致一個錯誤,從而保留此組合以備將來擴充。默認情況下,和 Perl 一樣,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母本身。當前沒有其它特性受此修正符控制。
u(PCRE_UTF8)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式字元串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性。

Ⅲ PHP正則表達式的使用技巧

PHP正則表達式的定義

用於描述字元排列和匹配模式的一種語法規則 它主要用於字元串的模式分割 匹配 查找及替換操作

PHP中的正則函數

PHP中有兩套正則函數 兩者功能差不多 分別為

一套是由PCRE(Perl Compatible Regular Expression)庫提供的 使用 preg_ 為前綴命名的函數

一套由POSIX(Portable Operating System Interface of Unix )擴展提供的 使用以 ereg_ 為前綴命名的函數 (POSIX的正則函數庫 自PHP 以後 就不在推薦使用 從PHP 以後 就將被移除)

由於POSIX正則即將推出歷史舞台 並且PCRE和perl的形式差不多 更利於我們在perl和php之間切換 所以這里重點介紹PCRE正則的使用

PCRE正則表達式

PCRE全稱為Perl Compatible Regular Expression 意思是Perl兼容正則表達式

在PCRE中 通常將模式表達式(即正則表達式)包含在兩個反斜線 / 之間 如 /apple/

正則中重要的幾個概念有 元字元 轉義 模式單元(重復) 反義 引用和斷言 這些概念都可以在文章[ ]中輕松的理解和掌握

常用的元字元(Meta character)

元字元 說明

/A 匹配字元串串首的原子

/Z 匹配字元串串尾的原子

/b 匹配單詞的邊界 //bis/ 匹配頭為is的字元串 /is/b/ 匹配尾為is的字元串 //bis/b/ 定界

/B 匹配除單詞邊界之外的任意字元 //Bis/啟局 匹配單詞 This 中的 is

/d 匹配一個數字 等價於[ ]

/D 匹配除數字以外任何一個字元 等價於[^ ]

/w 匹配一個英文字母 數字或下劃線 等價於[ a zA Z_]

/W 匹配除英文字母 數字和下劃線以外任何一個字元 等價於[^ a zA Z_]

/s 匹配一個空白字元 等價於[/f/t/v]

/S 匹配除空白字元以外任何一個字元 等價於[^/f/t/v]

/f 匹配一個換頁符等價於 /x c 或 /cL

匹配段旁鋒一個換行符 等價於 /x a 或 /cJ

匹配一個回車符等價於/x d 或 /cM

/t 匹配一個製表符 等價於 /x /或/cl

/v 匹配一個垂直製表符 等價於/x b或/ck

/oNN 匹配一個八進制數字

/xNN 匹配一個十六進制數字

/cC 匹配一個控制字元

模式修正符(Pattern Modifiers)

模式修正符在忽略大小寫 匹配多行中使用特別多 掌握了這一個修正符 往往能解決我們遇到的很多問題

i -可同時匹配大小寫字母

M -將字元串視為多行

S -將字元串視為單行 換行符做普通字元看待 使 匹配任何字元

X -模式中的空白忽略不計

U -匹配到最近的字元串

e -將替換的字元串作為表達使用

格式 /apple/i匹配 apple 或 Apple 等 忽略大小寫 /i

PCRE的模式單元

// 提取第一位的屬性

/^/d{ } ([/W])/d{ }// /d{ }$匹配 / / 等字元串 但上述正則表達式不匹配 / 的格式 這是因為模式 [/W] 的結果 / 已經被存儲 下個位置 / 引用時 其匹配模式也是字元 /

當不需要存儲匹配結果時使用非存儲模式單元 (? )

例如/(?:a|b|c)(D|E|F)// g/ 將匹配 aEEg 在一些正則表達式中 使握晌用非存儲模式單元是必要的 否則 需要改變其後引用的順序 上例還可以寫成/(a|b|c)(C|E|F)/ g/

PCRE正則表達式函數

以下為引用的內容

preg_match()和preg_match_all() preg_quote() preg_split() preg_grep() preg_replace()

函數的具體使用 我們可以通過PHP手冊來找到 下面分享一些平時積累的正則表達式

匹配action屬性

以下為引用的內容

$str = ; $match = ; preg_match_all( //s+action=/ (?!)( *?)/ /s/ $str $match); print_r($match);

在正則中使用回調函數

以下為引用的內容

/** * replace some string by callback function * */ function callback_replace() { $url = ; $str = ; $str = preg_replace ( /(?<=/saction=/ )(?!)( *?)(?=/ /s)/e search(/$url // ) $str ); echo $str; } function search($url $match){ return $url / $match; }

帶斷言的正則匹配

以下為引用的內容

$match = ; $str = xxxxxx cn bold font paragraph text

; preg_match_all ( /(?<=<(/w{ })>) *(?=</// >)/ $str $match ); echo 匹配沒有屬性的HTML標簽中的內容 ; print_r ( $match );

替換HTML源碼中的地址

以下為引用的內容

$form_ = preg_replace ( /(?<=/saction=/ |/ssrc=/ |/s)(?!|javascript)( *?)(?=/ /s)/e add_url(/$url / // / ) $form_ );

lishixin/Article/program/PHP/201311/21027

Ⅳ PHP-php中如何使用正則表達式匹配URL中的域名

<?php
//從URL中取得主機名
preg_match("/^(http://)?([^/]+)/i","IP/index.html",$matches);
$host=$matches[2];
//從主機名中取得後面兩段
preg_match("/[^./]+.[^./]+$/",$host,$matches);
echo"domainnameis:{$matches[0]} ";
?>

Ⅳ PHP 正則表達式

代碼如下:

<?php
$str=file_get_contents('http://abc.com/aaa.php');
if (preg_match('|<input name="a" type="hidden" value="([^"]*)"/>|', $str, $reg)) $out=$reg[1];
else $out='';
echo "$out<br>\n";
?>

熱點內容
招標伺服器雲 發布:2024-05-19 20:04:19 瀏覽:583
搭建小米雲伺服器 發布:2024-05-19 19:43:17 瀏覽:130
蘋果手機備忘錄怎麼加密 發布:2024-05-19 18:57:57 瀏覽:16
光榮腳本 發布:2024-05-19 18:57:48 瀏覽:997
pythonjson字元串 發布:2024-05-19 18:51:43 瀏覽:253
什麼是伺服器廠商介紹 發布:2024-05-19 18:50:09 瀏覽:371
伺服器網卡硬體型號怎麼看 發布:2024-05-19 18:36:41 瀏覽:666
修改pve伺服器ip 發布:2024-05-19 18:31:52 瀏覽:469
微信密碼忘記了如何取出裡面的錢 發布:2024-05-19 18:27:35 瀏覽:330
vs2005反編譯 發布:2024-05-19 18:26:34 瀏覽:364