Инверсия preg_quote в PHP - PullRequest
       24

Инверсия preg_quote в PHP

3 голосов
/ 07 февраля 2012

Мне нужно написать функцию, которая выполняет функции, совершенно противоположные функции 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 ]

5 голосов
/ 07 февраля 2012

Вы ищете полоски

<?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.php и http://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 для получения дополнительной информации..

3 голосов
/ 07 февраля 2012

Из руководства :

Специальные символы регулярного выражения:. \ + *? [^] $ () {} =! <> | : -

Вы можете написать функцию, которая заменяет \, сопровождаемый каждым из вышеперечисленных символов, на сам символ. Должно быть легко:

function inverse_preg_quote($str)
{
    return strtr($str, array(
        '\\.'  => '.',
        '\\\\' => '\\',
        '\\+'  => '+',
        '\\*'  => '*',
        '\\?'  => '?',
        '\\['  => '[',
        '\\^'  => '^',
        '\\]'  => ']',
        '\\$'  => '$',
        '\\('  => '(',
        '\\)'  => ')',
        '\\{'  => '{',
        '\\}'  => '}',
        '\\='  => '=',
        '\\!'  => '!',
        '\\<'  => '<',
        '\\>'  => '>',
        '\\|'  => '|',
        '\\:'  => ':',
        '\\-'  => '-'
    ));
}
$string1 = '<title>Hello (World)?</title>';
$string2 = inverse_preg_quote(preg_quote($string1));
echo $string1 === $string2;
0 голосов
/ 23 мая 2019

Вы можете использовать выделенную библиотеку T-Regx :

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
...