我创建了一个javascript正则表达式,以验证用户在我的应用中输入的评论。正则表达式允许字母,数字一些特殊符号和一系列表情符号
我收到了帮助here以正确格式化我的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()执行类似的过程。
所以我想用空字符串替换所有字符(正则表达式中没有包含的字符)。这是我的尝试,但它不起作用。谢谢你的帮助
$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
答案 0 :(得分:1)
PHP中的正则表达式有一个字符,它使正则表达式变得更糟。在你的情况下,你正在使用哈希(#),但该字符不应该出现在regex itslef中,它确实...
你必须在里面展开这个角色,或者使用另一个角色。为什么不使用与JS版本相同的“/”?好处是,它已经逃脱了。
我没看过,如果剩下的就可以了,但我想是的。
$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);
应该有用。
答案 1 :(得分:1)
答案 2 :(得分:1)
简而言之:使用
$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。
一点解释:
#
作为正则表达式分隔符,则转义模式中的#
,然后没有必要逃避/
)\uXXXX
必须替换为\x{XXXX}
表示法/u
UNICODE修饰符\x
表示法编写这些符号,而不是使用JavaScript中的双字节表示法^
来使其成为否定字符类来否定它。