php正則分組
『壹』 php正則表達式求教,在線等,日期提取
1, 一種是使用以下正則, 取得三個分組, 再將三個分組合並
(d{4})-(d{2})-(d{2})
'aabbccc2016-07-31cccddd99.88eee77.66ffff'.replace(/.*?(d{4})-(d{2})-(d{2}).*/,function(x,a,b,c){returna+b+c})
『貳』 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正則問題
/<img(.*?)src="(.+?)"\szoomfile="(.+?)"(.*?)width="(.*?)".+?\/>/
你忘了width後面的東西了。
『肆』 php 正則表達式選出來的東西怎麼分組
你這個正則有錯誤, 你這個匹配的是<img然後所有都行然後>結尾, 那麼,這種匹配方式,得到的就不一定是:<img src="">了, 他可以是<img src=""><img src="">。。。。等等
所有呢,應該改一下, /\<img([^>]*)\>/
『伍』 PHP正則表達式中分組的提取
我也不懂,你先用 /[AQI:(.*?)]/ /\[AQI:(.*?)\]/試試
或 /\[AQI:(.*?)\]/s
『陸』 請教PHP正則
?: 是個整體,這個意思是外面的括弧僅僅起分組的作用,匹配結果不出現在 $1 $2 $3 ... 裡面。
\+? 中的 ? 匹配0個至1個 +
(...)? 的 ? 同上,匹配括弧中的內容0次到1次
補充:
通常情況下,正則表達式的()可以將匹配結果提取出來。
比如/^(\d+)-(\d+)-(\d+)$/ 這樣的表達式可以匹配 "2010-03-01" 這樣的字元串,執行匹配之後會將結果放在 $1 $2 $3 裡面,$1的內容是2010, $2的內容是03,$3的內容是01。
括弧裡面開頭加 ?: 就是跳過這個括弧,也就是不提取其中內容,僅僅起分組的作用。如果用/^(?:\d+)-(\d+)-(\d+)$/ 匹配 "2010-03-01",$1的內容就是03,而不是2010了。
可以用以下程序驗證:
<?php
preg_match('/^(\d+)-(\d+)-(\d+)$/', '2010-03-01', $matches);
print_r($matches);
preg_match('/^(?:\d+)-(\d+)-(\d+)$/', '2010-03-01', $matches);
print_r($matches);
『柒』 /^(0|[1-9]\d*)([.]5)$/ 在PHP正則中是什麼意思
這個正則:匹配非負整數和非負整數加上0.5(即:xxx.5);
鑒於你給這么多分,詳細來講講哈:
^ 匹配開頭,$匹配結尾,意味著匹配的字元串,必須最多隻能是數字和".5"組成,不能包含其他字元。
()是分組,| 是或者的意思,\d*這個表示0-9,第一個括弧裡面的意思是,字元串為0,或者1-9裡面的任意數字,加上0-9組成的任意位數的數字,即一個正整數。
第二個括弧,[.],這裡面只有1個'.',等價於'\.',即小數點;後面的5就是數字5;最後加個問號,代表後面的".5"是可選的,可以不要。
總結:上面的正則能匹配:0,1,2,3,0.5,1.5,999,999.5這些類型的數字字元串。
有不明白的,歡迎繼續追問。
『捌』 PHP正則表達式((:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)/is是什麼意思
(?: )表示只進行分組,不進行捕獲
[0-9a-zA-Z$_.`-] ——0-9、a-z、A-Z或$、_、.、`、-中的一個字元
| ——表示或者
[\xC2-\xDF][\x80-\xBF] ——用十六進製表示的字元范圍【具體是什麼字元不太清楚,比如漢字的范圍一般是 4E00-9FA5】
+ ——前面的字元有一個或多個
(?: +) 外面的括弧( )——是捕獲括弧。即不捕獲單個匹配字元,只捕獲匹配的最大字串。
/is——是PHP中正則表達式模式修飾符,其中i代表 不區分大小寫,s代表:如果設定了這個修正符,那麼,被匹配的字元串將視為一行來看,包括換行符,換行符將被視為普通字元串。
模式修飾符還有:m、x、e等
『玖』 PHP正則表達式分組為什麼可這樣實現
preg_replace 和str_replace 這兩個的意思你可以去了解一下就明白了。