【问题标题】:Escaping certain characters doesn't work转义某些字符不起作用
【发布时间】:2017-12-02 22:50:57
【问题描述】:

我确定这是重复的,但我无法通过搜索找到答案。

这是我的代码

str_replace([' ',-,\(,\),\*,-,\|,\/], '', $params['telephone']), '0'

这行得通。我想要的是:

str_replace([' ',-,\(,\),/,|,\*,-,\#,\], '', $params['telephone']), '0'

只要我添加 #\ 它就会失败,并且逃避它们似乎不起作用。有没有其他方法可以逃脱它们?

虽然它看起来有效,但它似乎并没有取代初始空间。这可能是我问题的根源吗?

【问题讨论】:

  • 第一行怎么办?只有 1 个搜索字符串(空格)被引用。这是你的真实代码吗?

标签: php regex string escaping


【解决方案1】:

您想从字符串中删除空格、-()*-|/ 以及 \# 符号.

您需要将这些字符的数组传递给str_replace

$arr = [ '-', '(', ')', '*', '-', '|', '/', '\\', '#'];
$result = str_replace($arr, '', $s);

或者,您可以像这样使用带有preg_replace 的正则表达式:

$res = preg_replace('~[- ()*|/\\\\#]~', '', $s);

请参阅PHP demo

正则表达式详细信息

  • ~ 是一个正则表达式分隔符,所有 preg_ 函数都需要
  • - 必须放在字符类的开始/结束处,或者如果放在其他任何地方则转义,以匹配文字 -
  • \ 符号必须与 2 个文字 \s 匹配,这意味着需要 4 个反斜杠来匹配单个文字反斜杠
  • 在字符类中,*()|(和 +?. 也一样)在那里失去特殊状态,不需要转义
  • 如果您使用 Unicode 字符串,请在最后一个 ~ 正则表达式分隔符后添加 u 修饰符:'~[- ()*|/\\\\#]~u'

The difference between string replace and preg replace

str_replace 替换特定出现的文字字符串,例如 foo 将仅匹配并替换:foo

preg_replace 将使用正则表达式执行替换,例如 /f.{2}/ 将匹配和替换 foo,但也匹配和替换 feyfirfoxf12f ) 等。

【讨论】:

    【解决方案2】:

    使用 preg_replace()!

    您可以通过这种方式删除特定字符

    $foo = preg_replace('/[yourcharacters]/', '', $foo);
    

    您也可以通过添加 ^ (请参阅正则表达式表)以相反的方式执行此操作(删除除已确定字符之外的所有字符)。

    $foo = preg_replace('/[^theonlyallowedcharacters]/', '', $foo);
    

    【讨论】:

    • 谢谢,关于唯一允许部分的有用建议。也许我最好这样做,因为我只想要数字。感谢您花时间回答。
    • 你能帮我理解为什么在另一个答案有~之前和之后添加/吗?
    • 不客气!它只是表示正则表达式的开始和结束。如果您只想要数字并使用正则表达式过滤输入,则可以使用 /[^0-9]/。快乐编程:)
    • 在这个上下文中也只是一个分隔符!
    • 不,你不能以这种方式使用多个正则表达式。
    【解决方案3】:

    我认为您需要为正则表达式为特殊字符添加 \

    请用此代码替换,

     ['',\(,\),\/,\|,\*,-,\#,\\]
    

    不是你的,

    [' ',-,\(,\),/,|,\*,-,\#,\]
    

    希望对你有帮助。

    【讨论】:

    • 我认为这是不正确的,我使用了特殊字符,并通过反复试验和使用 PHP Storm 验证删除了不必要的字符。我也需要那个空间:)
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2014-06-08
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2021-12-25
    相关资源
    最近更新 更多