簡體   English   中英

你如何驗證正則表達式中的字符和單詞?

[英]how do you validate characters AND words in regex?

上下文

我需要一些代碼,它需要一個非常簡單的數學字符串並運行 PHP 的eval() function。 例如...

  $math = '25 * (233 - 1.5)';
  echo eval("return $math;"); // returns 5787.5

然而eval()在壞人手中是相當危險的,所以必須清除變量。 例如,對於上述情況,一個簡單的 preg_replace 將是......

  $math = '25 * (233 - 1.5)';
  $replace = '/[^0-9\(\)\.\,\+\-\*\/\s]/';
  $math = preg_replace($replace, '', $math);
  echo eval("return $math;"); // returns 5787.5

...確保$math僅包含有效字符... .,+-*/ ,空格和數字,並且沒有惡意代碼。

問題

我想允許一些非常具體的詞(PHP 數學函數),例如powpiminmax等。

在正則表達式中驗證字符和單詞的最干凈的方法是什么?

所以如果給定這個字符串......

pow(25,2) / pi(); hack the pentagon;

...我將如何刪除不在$replace正則表達式中的所有內容,但保留單詞powpi

使用 php,您可以匹配那些您不想刪除的單詞並使用(*SKIP)(*FAIL)方法。

您還可以通過刪除反斜杠來縮短字符 class,如果您在 php 中使用與/不同的分隔符,您也不必轉義/

當您將字符 class 中的匹配字符替換為空字符串時,您可以使用量詞+匹配 1 個或多個連續匹配並執行單個替換。

\b(?:p(?:i|ow)|m(?:in|ax))\b(*SKIP)(*FAIL)|[^0-9().,+*/\s-]+

模式匹配

  • \b(?:p(?:i|ow)|m(?:in|ax))\b匹配pi pow minmax
  • (*SKIP)(*FAIL)| 到目前為止匹配的內容不應該是匹配結果的一部分
  • [^0-9().,+*/\s-]+匹配除否定字符 class中列出的字符之外的任何字符的 1+ 次

正則表達式演示

如果您不想要開頭和結尾的空格,您可以考慮修剪$math

$math = 'pow(25,2) / pi(); hack the pentagon;';
$replace = '~\b(?:p(?:i|ow)|m(?:in|ax))\b(*SKIP)(*FAIL)|[^0-9().,+*/\s-]+~';
$math = preg_replace($replace, '', $math);
echo eval("return $math;"); // returns 198.94367886487

暫無
暫無

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

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