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

时间:2016-11-01 11:02:45

标签: php regex

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

我有以下if声明;

select
    x.*,
    hr.EmployeeID, hr.Title, c.FirstName, c.LastName 
from
    openxml (@IDoc, '/ROOT/Employee',1)
    with (
        EmployeeID  varchar(10),
        EmpStatus   varchar(20)
    ) as x
    inner join HumanResources.Employee hr with (nolock) on
        x.EmployeeID = hr.EmployeeID
    inner join Contactinfo c with (nolock)
        on hr.ContactID = c.ContactID;

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

我必须逃脱"和'引号和$符号以确保它不会破坏声明。

但似乎有效,但以下情况并不奏效。

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

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

我如何接受这些字符Hello, this is a single line. Don't you agree? This is also another line, see? 以及多行(行空行,空格等)。

修改

只是更新我在textarea中输入的内容以及实际返回的数据。

我在textarea中输入了以下内容;

A-Za-z0-9-_=+,.:;/\!?%^&*()@#\"\'£\$€

使用print_r;

返回以下内容
Testing 123

Testing 123

1 个答案:

答案 0 :(得分:0)

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

  1. 正则表达式错过了一个字符来接受任何类型的空格,你应该将它更新为~[A-Za-z0-9-_=+,.:;/\!?%^&*()@#\"\'£\$€\s]+~这里我用\s替换你的空格字符,以便它支持任何类型的空格(即标签,换行符等)
  2. 您忘记了使用$data['text']stripcslashes转义输入字符串。
  3. 修复后仍然需要验证输入,为此,您可以使用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
    ====
    
    ====