當前位置:首頁 » 編程語言 » phpa正則

phpa正則

發布時間: 2022-06-08 00:56:39

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的正則,怎麼匹配a標簽

preg_match_all ('/<a href="(.*?)".*?>(.*?)</a>/i',$yuanstr,$matches);
$1是鏈接 $2是鏈接文字

Ⅲ 怎麼用php正則獲得a標簽內的文字啊

php中正則匹配只要使用這兩個函數:

preg_match_all

preg_match

這里使用preg_match_all,代碼如下:

$subject='<ahref="xxx.php">abc測試</a>';//假設這是需要匹配的字元串

$pattern='/<ahref="[^"]*"[^>]*>(.*)</a>/';//這是匹配的正則表達式

preg_match_all($pattern,$subject,$matches);//開始匹配,該函數會把匹配結果放入$matches數組中


echo"<pre>";
print_r($matches);
/**
結果是:

Array
(
[0]=>Array
(
[0]=>abc測試
)

[1]=>Array
(
[0]=>abc測試
)

)

*/

Ⅳ php正則表達式匹配a標簽

我的理解是匹配<a 字元串>,字元串中不能有"

Ⅳ php 正則表達是匹配a標簽

可以,但是要用非貪婪模式:

'/<a.+?</a>/is';
'/<a[sS]+?</a>/i';

[sS] 表示任意字元(. 是除換行以外的任意字元)

+? 或 *? 是非貪婪模式的意思

兩個正則是等效的

Ⅵ PHP 正則匹配A標簽獲得連接和文字

<a\b[^>]*\bhref=([^\s>]+)[^>]*>[\s\S]*?([^<>]*)</a>

解釋:
<a\b #匹配a標簽的開始
[^>]* #匹配a標簽href屬性前的其他屬性
\bhref=([^\s>]+) #匹配href屬性,並將匹配到的內容捕獲到分組1當中
[^>]*> #匹配a標簽的結束
[\s\S]*? #匹配a標簽文本前的img標簽
([^<>]*) #匹配a標簽文本並捕獲到分組2當中
</a> #匹配a標簽的關閉

分組1和分組2即為所需內容

簡化版:
<a\s*href=([^>]+)><img[^>]+>([^>]+)</a>
實際上簡化版可能效率更高……因為嚴格按照原文本格式來匹配。
不過如果標簽形式有一點變化就可能導致匹配失敗,所以這里寫了兩個版本。。

Ⅶ php正則表達式

這里涉及到正則表達式中得子串捕獲的概念。php中的正則表達式使用的是pcre正則庫,因此使用方式上和pcre是相同的,只不過是為了使用方便封裝了一起便捷的操作而已。preg_match函數和preg_match_all函數用於在php中進行正則表達式的相關處理。下面看下preg_match函數的定義:intpreg_match(string$pattern,string$subject[,array&$matches])在$subject中查詢$pattern,如果找到則把匹配的字元串存儲在$matches中。$matches[0]中存放整個匹配的字元串,$matches[i]中存放匹配到的第i個捕獲子串。題目的解決方法:$pattern="/^NAME(.*){$/";preg_match($pattern,$string,$match);echo$match[1];//$match[1]為提取的NAME和{之間的內容。關於捕獲組信息($match的信息)詳情,可以參考文檔:http://wang

Ⅷ php 正則 <a ></a> 中的 href 和img 地址

針對給定的標本數據,編寫如下正則供參考:

1、提取 jpg 地址鏈接

"(http://.*?.jpg)"



2、提取 a href 或是 img src 標簽中的 jpg 地址鏈接

[href|src]="(http://.*?.jpg)"


3、提取<a></a>標簽中的 jpg 地址鏈接

(<a.*)(http://.*.jpg)(".*")(http:/.*.jpg)(".*)</a>

Ⅸ php正則匹配所有a標簽,並刪除

1,過濾所有html標簽的正則表達式:</?[^>]+>
2,過濾所有html標簽的屬性的正則表達式:$html = preg_replace("/<([a-zA-Z]+)[^>]*>/","<\\1>",$html);
3,過濾部分html標簽的正則表達式的排除式(比如排除<p>,即不過濾<p>):</?[^pP/>]+>
4,過濾部分html標簽的正則表達式的枚舉式(比如需要過濾<a><p><b>等):</?[aApPbB][^>]*>
5,過濾部分html標簽的屬性的正則表達式的排除式(比如排除alt屬性,即不過濾alt屬性):\s(?!alt)[a-zA-Z]+=[^\s]*

熱點內容
映像壓縮 發布:2024-05-21 05:46:53 瀏覽:726
小葫蘆直播助手伺服器地址 發布:2024-05-21 05:46:51 瀏覽:969
遨遊緩存視頻 發布:2024-05-21 05:46:47 瀏覽:784
家用電腦能裝伺服器 發布:2024-05-21 05:45:56 瀏覽:437
閉魚腳本 發布:2024-05-21 05:45:54 瀏覽:66
動態范圍壓縮開還是關 發布:2024-05-21 05:44:23 瀏覽:549
本田crv兩驅買哪個配置 發布:2024-05-21 05:41:22 瀏覽:75
手機淘寶緩存視頻 發布:2024-05-21 05:21:09 瀏覽:348
4款配置怎麼選 發布:2024-05-21 05:20:03 瀏覽:586
python服務重啟 發布:2024-05-21 05:07:51 瀏覽:668