你能帮我用php preg_replace改写我的javascript正则表达式吗?

时间:2017-01-15 21:48:38

标签: javascript php regex validation

我创建了一个javascript正则表达式,以验证用户在我的应用中输入的评论。正则表达式允许字母,数字一些特殊符号和一系列表情符号

我收到了帮助here以正确格式化我的javascript正则表达式,我使用的最终表达式如下:

Javascript Regex:

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

3 个答案:

答案 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)

\u....序列转换为\x{....},结果似乎是一个有效的PHP正则表达式。

模式:\\u(\w{4})

替换:\\x{$1}

regex101 demo

答案 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

一点解释:

  • 只撤消模式 AND 正则表达式分隔符中的特殊正则表达式元字符(如果选择#作为正则表达式分隔符,则转义模式中的#,然后没有必要逃避/
  • PCRE中的
  • \uXXXX必须替换为\x{XXXX}表示法
  • 由于要处理的文本是Unicode,并且模式中的字符超出ASCII范围,因此必须使用/u UNICODE修饰符
  • 由于大多数表情符号都位于BMP平面之外,并且字符串现在被视为Unicode代码点链,因此必须使用扩展的\x表示法编写这些符号,而不是使用JavaScript中的双字节表示法
  • 您的3个替代方案可以合并为1个大字符类,然后您想通过在其开头添加^来使其成为否定字符类来否定它。