![](/img/trans.png)
[英]In RegEx, how do you find a line that contains no more than 3 unique characters?
[英]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 數學函數),例如pow
、 pi
、 min
、 max
等。
在正則表達式中驗證字符和單詞的最干凈的方法是什么?
所以如果給定這個字符串......
pow(25,2) / pi(); hack the pentagon;
...我將如何刪除不在$replace
正則表達式中的所有內容,但保留單詞pow
和pi
?
使用 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
min
或max
(*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.