0

我有一个来自文本区域的文本,其中包含 4 个必要的字符串。在我将此文本插入数据库之前,我会检查这些字符串是否存在。

有没有比 4 次preg_match操作更好的替代方法,也许使用preg_match_all

如果我想strings用其他东西替换这 4 个,preg_replace和之间的区别在哪里str_replace。我应该使用哪个?

这是我的代码:

if(isset($_POST['text'])){
    $text= $link->real_escape_string($_POST['text']);

    $string = $text;
    $pattern1 = '/LIMITE_TYPE/';
    $pattern2 = '/LIMITE_SET/';
    $pattern3 = '/TODAY_PRICE/';
    $pattern4 = '/AUTO_SIGN/';

    if(preg_match($pattern1, $string)
       && preg_match($pattern2, $string)
       && preg_match($pattern3, $string)
       && preg_match($pattern4, $string))
    {
        echo 'ok';
    }else{
        echo 'not found';
    }

    die();
}
4

3 回答 3

1

没有一个函数可以在一次调用中完成您想要的操作,但是您可以使用循环,这也使替换变得更加容易。你也不需要正则表达式,普通的字符串函数已经做了你需要的

$string = $text;
$patterns = array(
    'LIMITE_TYPE' => 'REPLACEMENT1',
    'LIMITE_SET' => 'REPLACEMENT2',
    'TODAY_PRICE' => 'REPLACEMENT3',
    'AUTO_SIGN' => 'REPLACEMENT4'
);

// check if they are all there:
$valid = true;
foreach($patterns as $pattern => $replacement)
{
    if(strpos($string, $pattern) === false) {
        $valid = false;
        break;
    }
}
if($valid)
{
    // replace them
    foreach($patterns as $pattern => $replacement)
    {
        $string = str_replace($pattern, $replacement, $string);
    }
}
else
{
    // not valid
}
于 2013-08-26T14:34:40.097 回答
1

您可以使用 str_pos 更快地搜索:

$string = $text;
$pattern1 = 'LIMITE_TYPE';
$pattern2 = 'LIMITE_SET';
$pattern3 = 'TODAY_PRICE';
$pattern4 = 'AUTO_SIGN';

$patterns = array($pattern1, $pattern2, $pattern3, $pattern4);

if (strpos($pattern1, $text) && strpos($pattern2, $text) ... etc )
{   
    str_replace($patterns, $string, $text); //replace  patterns with string on text
}

我认为这是更快的方法,但不知道为什么。

于 2013-08-26T14:27:59.467 回答
1

如果您只想检查是否存在确切的单词,则不需要使用正则表达式,strpos而是使用更快:

$word1 = 'LIMITE_TYPE';
$word2 = 'LIMITE_SET';
$word3 = 'TODAY_PRICE';
$word4 = 'AUTO_SIGN';

if  ( (strpos($string, $word1)
    && strpos($string, $word2)
    && strpos($string, $word3)
    && strpos($string, $word4))!==false) {

但是,如果您真的需要模式(内部带有正则表达式功能):

$patterns = array('~\bLIMITE_TYPE\b~',
                  '~\bLIMITE_SET\b~',
                  '~\bTODAY_PRICE\b~',
                  '~\bAUTO_SIGN\b~'); 
$found = true;
foreach($pattern as $pattern) {
    if (!preg_match($pattern, $string)) {
        $found = false;
        break;
    }
}
echo ($found)? 'ok' : 'not found';

这些代码的优点是测试在第一个错误结果处停止。

于 2013-08-26T14:28:24.370 回答