1

我想做一些自定义字符转义,这意味着我希望某些字符前面没有一些特殊字符,前提是它们之前没有那个特殊字符。我想我需要一个正则表达式替换。实现这一目标的最简单方法是什么?我尝试了一些消极的后视断言,但最终一无所获。

编辑:想象一下,我希望任何abc字符都可以用 进行转义\,所以debby我应该de\b\byda\bby我想做的时候得到d\a\b\by。我想这个例子不是那么有创意,但我相信它解释了我的意思(尚未转义的转义字符)

EDIT2:嗯,我实际上想做的是把一串

([A-Za-z]+)/([A-Za-z]+)/([A-Za-z]+)

进入

([A-Za-z]+)\/([A-Za-z]+)\/([A-Za-z]+)

在第一个字符串中,正斜杠是某种分隔符(我希望以后会有更多,我也想同时 escape ) .,我需要\使用它来转义另一种(更简单的)模式。我试过(不确定第二个论点,但我相信这不是问题)

preg_replace("/(?<!\\)([\/])/", "\\$0", $string);

$string在哪里([A-Za-z]+)/([A-Za-z]+)/([A-Za-z]+)。没运气。

希望我现在说清楚了

解决方案:

preg_replace("/(?<!\\\\)[\/]/", "\\\\$0", $string);在方括号中,我把要转义的字符。

4

1 回答 1

5

我做了一个易于使用的功能来做到这一点。它将用任何字符或字符串转义任何字符集。如果您计划将来更改要转义的字符或转义序列,它也会变得容易。

function escapeChars($charsToEscape, $escapeSeq, $string)
{
    $charsToEscape = preg_quote($charsToEscape, '/');
    $regexSafeEscapeSeq = preg_quote($escapeSeq, '/');
    $escapeSeq = preg_replace('/([$\\\\])/', '\\\$1', $escapeSeq);
    return(preg_replace('/(?<!'.$regexSafeEscapeSeq.')(['.$charsToEscape.'])/', $escapeSeq.'$1', $string));
}

参数

$charsToEscape : 要转义的字符

  • 'a' 只转义 'a'
  • 'abc' 转义 'a'、'b' 和 'c'

$escapeSeq:转义序列字符/字符串

  • 可以是任何字符或字符串。例如:'/'、'#'、'$'、'$#/'、'$$$'、'a'、'hello'等。

  • 要使用 '\' 作为转义序列,请给出 '\\'

  • 对于 '\\',给出 '\\\\' - 因为 php 认为 '\' 在另一个 "\" 或 " ' " (如果用单引号定义字符串)或 ' " ' (如果用双引号定义字符串引号)作为转义序列

$string:要从中转义字符的字符串

在您的具体情况下,使用

$string = '([A-Za-z]+)/([A-Za-z]+)/([A-Za-z]+)';    
echo escapeChars('/', '\\', $string);
于 2013-08-08T23:24:39.360 回答