如何正确使用preg_match来接受包括新行在内的字符


How to use preg_match properly to accept characters including new lines?

我尝试使用一系列问题来构造一个preg_match if语句来检查字符串,并确保它包含可以通过系统接受的字符。

我有下面的if语句;

if ( !preg_match("~[A-Za-z0-9-_=+,.:;/'!?%^&*()@#'"''£'$€ ]~", $data['text']) ) {}

我在字符串中使用~作为分隔符,并希望确保上述字符在传递的任何字符串中都被接受。

我必须转义"和'引号和$符号,以确保它不会破坏语句。

它似乎可以工作,但是下面的不起作用。

Hello, this is a single line. Don't you agree?
This is also another line, see?

经过一些尝试和错误,似乎逗号也导致字符串检查失败,但它也在preg_match规则中。

我如何接受这些字符A-Za-z0-9-_=+,.:;/'!?%^&*()@#'"''£'$€以及多行(行空行,空格等)。

编辑

只是对我在文本区输入的内容和实际返回的数据进行了更新。

我在文本区输入了以下内容;

Testing 123
Testing 123

使用print_r;

返回以下语句
Testing 123'r'n'r'nTesting 1231

我再看了一下你的问题,实际上有两个问题:

  1. 正则表达式缺少一个字符来接受任何类型的空格,你应该将其更新为~[A-Za-z0-9-_=+,.:;/'!?%^&*()@#'"''£'$€'s]+~这里我用's替换了末尾的空格字符,以便它支持任何类型的空格(即制表符,换行符等)
  2. 您忘记转义$data['text']的输入字符串,您可以使用stripcslashes

修复后,你仍然需要验证你的输入,这样做,你可以使用preg_replace创建一个新的字符串,将包含所有无效字符,如果有任何。从这里你只需要检查字符串是否为空,如果是,那么输入是有效的。

下面是我用来测试的代码:
<?php
$data = 'Testing 123'r'n'r'nTesting 1231';
$unescaped_data = stripcslashes($data);
$impureData = preg_replace("~[A-Za-z0-9-_=+,.:;/'!?%^&*()@#'"''£'$€'s]+~", 
    '', $unescaped_data);
if (0 == strlen($impureData)) {
    echo 'TRUE';
}
else {
    echo 'FALSE';
}
print_r("
====
$data
====
$impureData
====
");

我得到这个结果:

TRUE
====
Testing 123'r'n'r'nTesting 1231
====
====