【问题标题】:Escape a group of characters with another character用另一个字符转义一组字符
【发布时间】:2013-08-09 07:24:39
【问题描述】:

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

编辑:想象一下,我想用\ 转义任何abc 字符,所以给debby 我应该得到de\b\by 而在da\bby 之外我想得到d\a\b\by。我想这个例子不是那么有创意,但我相信它解释了我的意思(尚未转义的转义字符)

EDIT2:好吧,我实际上想做的是转一串

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

进入

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

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

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

其中$string([A-Za-z]+)/([A-Za-z]+)/([A-Za-z]+)。没运气。

希望我现在说清楚了

解决方案:

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

【问题讨论】:

  • 更多详情!例子!什么输入?什么输出?
  • 你能举出例子和你尝试了什么吗?
  • @patryk 好的,我明白了。你的表达是正确的,但它不会在 PHP 中工作。使用 4 个反斜杠:/(?<!\\\\)([abc])/,看看我对一些 explanation 的早期回答
  • @HamZa 感谢您提供这些提示,我在这里不仅似乎是新手。

标签: php regex


【解决方案1】:

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

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);

【讨论】:

  • 这几乎就是我所做的,但是你已经概括了我的情况,这对我来说很酷,我相信你的回答比我的描述本身更好地解释了我的问题。我将把你的功能放在我的小项目中。谢谢
猜你喜欢
  • 2015-01-17
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多