【问题标题】:PHP regex to find non-espaced lettersPHP正则表达式查找非空格字母
【发布时间】:2011-01-19 22:00:13
【问题描述】:

我想替换 F 而不是 \F。

我尝试了以下代码,但没有任何运气。

preg_replace("/[^\\]F/", "f", $str);

【问题讨论】:

  • 反斜杠本身可以用反斜杠转义吗?

标签: php regex preg-replace


【解决方案1】:

试试这个:

preg_replace("/(?<!\\\)F/", "f", $str);

【讨论】:

  • +1,很好。我不熟悉那个语法,你能解释一下正则表达式吗?
  • 它是一个消极的回顾。看看这个和更多here
  • 这被称为零宽度否定后视断言。你可以在这里找到更多关于这个主题的信息perldoc.perl.org/perlre.html(不是很容易阅读,但很全面)。基本上,它会查找前面没有 \ 的每个 F (如另一个答案中所述,反斜杠需要出现 3 次,一次用于字符串转义,一次用于正则表达式转义)
【解决方案2】:

这行得通。

$string = preg_replace('/([^\\\]|^)F/', '$1f', $string);

之所以有三个反斜杠,是因为第一个反斜杠转义了字符串的第二个,而那个转义了正则表达式的最后一个。这是另一个网站上关于它的主题:http://forums.devnetwork.net/viewtopic.php?t=125752

更新:感谢@Damp 和@webbiedave

【讨论】:

  • -1 这不起作用,因为它会去除字母前面的字符(abcF 将被 abf 替换)
  • @Damp:不错的收获。我得考虑一下。
  • 使用反向引用来保留非斜杠字符:preg_replace('/([^\\\\]|^)F/', '$1f', 'Fabc'); 我也在检查字符串的开头。您还可以查看负面的后视。
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多