如何防止 trim 中的某些字符在 php 中起作用

How to prevent some characters in trim function in php

我在变量中有一个字符串

$str = '"100 \""';

我想对 trim '"'(双引号)字符使用 trim 函数,转义字符后的字符除外。

$str = trim($str, '"');

但它是 trim所有双引号, 那么谁能告诉我如何防止这种情况发生? 无论如何,我已经为此编写了自己的 trim 函数,但想在 php.

中使用标准 API 函数

很好,我咬。您需要使用的是正则表达式中的负向回顾。表达式的最简单形式如下所示:

/(?<!\)"/

细分:

  • (?<!:负向后看。这意味着您要检查表达式是否 而不是 前面有特定模式:
  • \):后视模式。在这种情况下,模式只有在其前面没有文字 \.
  • 时才会匹配
  • ":文字 "。同样,由于回溯,您不会匹配转义的双引号。

demo

对于您的情况,您可能正在寻找:

$str = preg_replace('/(?<!\)"/', '', $str);

用空字符串替换所有未转义的 "(基本上删除它们)。


因为您使用的是 trim,您可能只想删除前导引号和尾随引号。在那种情况下,您必须稍微改变一下表达式,然后使用:

/(?<!\)(^"|"$)/

细分:

  • (?<!\): 和以前一样(负后视)
  • (^"|"$):仍然匹配文字 ",但前提是它是字符串的开头或结尾。

当然,您并不真的需要前导引号的回顾,所以这个表达式同样有效(如果不是更好的话):

/(^"|(?<!\)"$)/

细分:

  • ^":匹配字符串中的第一个字符,如果它是未转义的 ".
  • (?<!\):相同的旧负面回顾
  • "$:匹配字符串末尾的双引号(仅当其前面没有 \ 时,根据负向后视

这两个正则表达式都允许您像这样处理字符串:

$str = '"foo"bar\""';
echo preg_replace('/(^"|(?<!\)"$)/', '', $str);

输出foo"bar\"

Demo II

尝试用负向回顾替换正则表达式。像这样的一些表达式应该可以解决问题:

(?<!\)"