簡體   English   中英

尋找技巧以更好地理解 Perl 兼容的正則表達式運算符和語法

[英]Looking for tips to better understand Perl Compatible Regular Expression operators and syntax

我的問題是關於 Perl Compatible Regular Expression operators and syntax。 我已經了解了“/hello/”的基本語法,而 /i 表示不區分大小寫。 我在jotform.com上對此進行了調查,並將對此進行研究,直到我有更深入的了解。 但我希望有人可以讓我先了解我在下面發布的 (2) PCRE 中的 Perl 語法和運算符。 它們都致力於防止用戶以文本區域的形式發布鏈接,但在語法和運算符上有很大不同。 只是想知道一個正則表達式是否優於另一個。 哪個最好,為什么?

更新:經過幾個月的實時測試,PCRE 1 似乎無法阻止 PHP 聯系表中的 URL。 PCRE 2 似乎確實可以在同一實時測試期間阻止 PHP 聯系表中的 URL。

下面的 2 個正則表達式最初是在How to prevent spam URLs in a PHP contact form 中找到的

有比 PCRE 2 更好的正則表達式嗎? 任何幫助或建議將不勝感激。

謝謝。

<?php

//PCRE 1 - Does not work to prevent URLs 

if (preg_match( '/www\.|http:|https:\/\/[a-z0-9_]+([\-\.]{1}[a-z_0-9]+)*\.[_a-z]{2,5}'.'((:[0-9]{1,5})?\/.*)?$/i', $_POST['message']))
{
echo 'error please remove URLs';
}else
{....

//PCRE 2 - Does work to prevent URLs 

if (preg_match("/\b(?:(?:https?|ftp|http):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$_POST['message']))
{
echo 'error please remove URLs';
}else
{....

?>

為了提供答案以便將此頁面標記為已解決(而不是放棄),我將對第二種模式進行改進。

/\b(?:(?:https?|ftp|http):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i

可以重寫為:

\b(?:(?:f|ht)tps?:\/\/)[-\w+&@#\/%?=~|!:,.;]*[-\w+&@#\/%=~|]
  • 第一段匹配httpshttpftpsftp作為“全字” ( \b ) 使用交替 ( | ) 和零或一個量詞 ( ? )。 您的原始模式需要 url 的“協議”部分存在,因此我不會更改模式邏輯。
  • 您模式中的子域需要www. 盡管子域在有效的 url 中不是必需的,並且除www. 可以使用。 我將更改此部分的模式邏輯,使子域可選且更靈活。
  • 字符 class(白名單字符)合並了www. , 因此可以從模式中省略文字匹配。
  • 我通過使用\w減少了兩個字符類的長度——它包括所有字母數字字符(大寫和小寫)以及下划線。
  • 下面是匹配內容的演示: https://regex101.com/r/TP16iB/1——您會發現像www.example.com這樣的有效 url 與您的首選模式和我的模式都不匹配。 為了克服這個問題,您可以對www. 作為必需的子域並使協議可選,但這樣你就不會匹配可變子域。 所以你看,這有點像兔子洞,你需要權衡你希望投入多少時間和你的應用程序真正需要什么。 請注意,您的模式變得越准確,其總長度/卷積也會增加。
    \b(?:(?:(?:f|ht)tps?:\/\/)|(?:www\.))\[-\w+&@#\/%?=~|:,.;;\]*\[-\w+&@#\/%=~|\]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM