【问题标题】:Getting backslash-unescaped characters获取反斜杠未转义的字符
【发布时间】:2012-02-10 07:22:38
【问题描述】:

我正在研究 date() 之类的日期转换函数,需要解析字符串并留下转义字符。

我的意思是通过正则表达式(或任何更好的方式)将 $str1 更改为 $str2:

$str1 = '5852& ^ \a\\b\\\\\c D \\e k.';
$str2 = 'bDek';

$str2 只有 [a-zA-Z] 没有被反斜杠转义。

问候,

【问题讨论】:

  • @fge 不在 php man 中的 perl 中!我也在 JavaScript 中得到它!
  • @micha 我提出的正则表达式与 PCRE(因此 PHP) ECMA 262(因此 JavaScript)兼容...
  • @fge 你怎么知道你测试过了?
  • @micha 我知道,因为我知道这两种正则表达式方言都可以使用哪些结构......两者都支持非捕获组和单词锚,这是我唯一的两个“非传统”结构在这里使用。

标签: php regex string filter backslash


【解决方案1】:

这可能会为您解决这个问题:

(?:^|[^\\](?:\\\\)*)([a-zA-Z])\b

Perl 演示:

$ perl -ne 'print "-->$_<--\n" foreach m/(?:^|[^\\](?:\\\\)*)([a-zA-Z])\b/g'
5852& ^ \a\\b\\\\\c D \\e k.                                                                              
-->b<--
-->D<--
-->e<--
-->k<--
o\a\\b\\\c\\\\d
-->o<--
-->b<--
-->d<--

正则表达式如下:

(?:               # begin non capturing group
  ^               # the beginning of input,
  |               # or
  [^\\]           # a character which is not a backslash, followed by
  (?:\\\\)*       # two backslashes, zero or more times
)                 # end non capturing group, followed by
([a-zA-Z])        # a letter, captured, followed by
\b                # a word break

【讨论】:

  • 谢谢@fge。我如何在 PHP 中使用它? "/(?:^|[^\\](?:\\\\)*)([a-zA-Z])\b/" 因为 preg_replace() 模式不起作用!
  • 我想你最好的选择是使用preg_match_all 并将结果收集到一个数组中。然后就是通过将数组元素连接成一个字符串来构建结果字符串......我确定 PHP 有类似的东西(注意:我不知道 PHP 保存与正则表达式相关的函数)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
相关资源
最近更新 更多