在PHP中反转preg_quote

时间:2012-02-07 08:10:49

标签: php regex inverse

我需要编写一个与preg_quote函数完全相反的函数。简单地删除所有'\'都不起作用,因为字符串中可能有'\'。

实施例

inverse_preg_quote('an\\y s\.tri\*ng') //this should return "an\y s.tri*ng" 

或者你可以测试为

inverse_preg_quote(preg_quote($string)) //$string shouldn't change

3 个答案:

答案 0 :(得分:5)

您正在寻找striplashes

<?php
    $str = "Is your name O\'reilly?";

    // Outputs: Is your name O'reilly?
    echo stripslashes($str);
?>

有关详细信息,请参阅http://php.net/manual/en/function.stripslashes.php。 (还有一些你想要研究的多功能http://www.php.net/manual/en/function.addcslashes.phphttp://www.php.net/manual/en/function.stripcslashes.php

编辑:否则,您可以执行三次str_replace调用。第一个用例如替换\\ $ DOUBLESLASH,然后将\替换为“”(空字符串),然后将$ DOUBLESLASH设置回\。

$str = str_replace("\\", "$DOUBLESLASH", $str);
$str = str_replace("\", "", $str);
$str = str_replace("$DOUBLESLASH", "\", $str);

有关详细信息,请参阅http://php.net/manual/en/function.str-replace.php

答案 1 :(得分:3)

来自manual

  

特殊的正则表达式字符是:。 \ + *? [^] $(){} =! &LT; &GT; | : -

您可以编写一个函数来替换\,然后将上述每个字符替换为字符本身。应该很容易:

function inverse_preg_quote($str)
{
    return strtr($str, array(
        '\\.'  => '.',
        '\\\\' => '\\',
        '\\+'  => '+',
        '\\*'  => '*',
        '\\?'  => '?',
        '\\['  => '[',
        '\\^'  => '^',
        '\\]'  => ']',
        '\\$'  => '$',
        '\\('  => '(',
        '\\)'  => ')',
        '\\{'  => '{',
        '\\}'  => '}',
        '\\='  => '=',
        '\\!'  => '!',
        '\\<'  => '<',
        '\\>'  => '>',
        '\\|'  => '|',
        '\\:'  => ':',
        '\\-'  => '-'
    ));
}
$string1 = '<title>Hello (World)?</title>';
$string2 = inverse_preg_quote(preg_quote($string1));
echo $string1 === $string2;

答案 2 :(得分:-1)

您可以使用专用的T-Regx library

Pattern::unquote('an\\y s\.tri\*ng'); // 'any s.tri*ng'

它也是100%可传递的,所以

$input = 'an\\y s\.tri\*ng';
$output = Pattern::unquote(Pattern::quote($input);

$input === $output; // always true