我创建了一个 JavaScript 正则表达式来验证用户在我的应用程序中输入的评论。正则表达式允许使用字母、数字、一些特殊符号和一系列表情符号
我收到了帮助here正确格式化我的 javascript 正则表达式,我使用的最终表达式如下:
Javascript 正则表达式:
commentRegex = /^(?:[A-Za-z0-9\u00C0-\u017F\u20AC\u2122\u2150\u00A9 \/.,\-_$!\'&*()="?#+%:;\<\[\]\r\r\n]|(?:\ud83c[\udf00-\udfff])|(?:\ud83d[\udc00-\ude4f\ude80-\udeff]))*$/;
有人建议我在服务器端(使用 php)执行相同的验证,因此我尝试使用 preg_replace() 执行类似的过程。
所以我想用空字符串替换所有字符(不包含在正则表达式中)。这是我的尝试,但它不起作用。感谢您的帮助
PHP
$commentText = preg_replace('#^(?:[A-Za-z0-9\u00C0-\u017F\u20AC\u2122\u2150\u00A9 \/.,\-_$!\'&*()="?#+%:;\<\[\]\r\r\n]|(?:\ud83c[\udf00-\udfff])|(?:\ud83d[\udc00-\ude4f\ude80-\udeff]))*$#', '', $commentText);
编辑:
在采纳了您在评论中的建议后,我现在有了以下正则表达式。
$postText = preg_replace('/^(?:[A-Za-z0-9\x{00C0}-\x{017F}\x{20AC}\x{2122}\x{2150}\x{00A9} \/.,\-_$!\'&*()="?\#\+%:;\<\[\]\r\n]|(?:\x{d83c}[\x{df00}-\x{dfff}])|(?:\x{d83d}[\x{dc00}-\x{de4f}\x{de80}-\x{deff}]))*$/', '', $postText);
但是我收到警告
<b>Warning</b>: preg_replace(): Compilation failed: character value in \x{} or \o{} is too large at offset 30 in <b>submit_post.php</b> on line <b>37
最佳答案
简而言之:使用
$re = '/[^A-Za-z0-9\x{00C0}-\x{017F}\x{20AC}\x{2122}\x{2150}\x{00A9} \/.,\-_$!\'&*()="?#+%:;<[\]\r\n\x{1F300}-\x{1F3FF}\x{1F400}-\x{1F64F}\x{1F680}-\x{1F6FF}]+/u';
$text = 'test>><<<®¥§';
echo preg_replace($re, '', $text);
请参阅PHP demo .
一点解释:
- 仅转义模式内的特殊正则表达式元字符和正则表达式分隔符(如果您选择
#
作为正则表达式分隔符,请转义#
在模式中,然后不需要转义/
)
PCRE 中的 \uXXXX
必须替换为\x{XXXX}
表示法- 由于要处理的文本是 Unicode,并且模式中的字符超出了 ASCII 范围,因此必须使用
/u
UNICODE 修饰符 - 由于大多数表情符号都位于 BMP 平面之外,并且字符串现在被视为 Unicode 代码点链,因此这些符号必须使用扩展的
\x
表示法编写,而不是使用两字节表示法在 JavaScript 中 - 您的 3 个替代方案可以合并为 1 个大字符类,然后您想通过在其开头添加
^
使其成为否定字符类来否定它。
关于javascript - 你能帮我使用 php preg_replace 重写我的 javascript 正则表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666698/