[英]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+&@#\/%=~|]
https
、 http
、 ftps
或ftp
作為“全字” ( \b
) 使用交替 ( |
) 和零或一個量詞 ( ?
)。 您的原始模式需要 url 的“協議”部分存在,因此我不會更改模式邏輯。www.
盡管子域在有效的 url 中不是必需的,並且除www.
可以使用。 我將更改此部分的模式邏輯,使子域可選且更靈活。www.
, 因此可以從模式中省略文字匹配。\w
減少了兩個字符類的長度——它包括所有字母數字字符(大寫和小寫)以及下划線。www.example.com
這樣的有效 url 與您的首選模式和我的模式都不匹配。 為了克服這個問題,您可以對www.
作為必需的子域並使協議可選,但這樣你就不會匹配可變子域。 所以你看,這有點像兔子洞,你需要權衡你希望投入多少時間和你的應用程序真正需要什么。 請注意,您的模式變得越准確,其總長度/卷積也會增加。\b(?:(?:(?:f|ht)tps?:\/\/)|(?:www\.))\[-\w+&@#\/%?=~|:,.;;\]*\[-\w+&@#\/%=~|\]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.