【问题标题】:Regex escape specific characters正则表达式转义特定字符
【发布时间】:2011-06-29 19:58:32
【问题描述】:

我正在使用 preg_split 来制作包含一些值的数组。 如果我有诸如 'This*Value' 之类的值,preg_split 会将值拆分为 array('This', 'Value') 因为值中有 *,但我想将它拆分到我指定的位置,而不是* from the value.如何才能对值进行转义,使字符串中的符号不​​对表达式生效?

例子:

// Cut into {$1:$2}
$str = "{Some:Value*Here}";
$result = preg_split("/[\{(.*)\:(.*)\}]+/", $str, -1, PREG_SPLIT_NO_EMPTY);

// Result:

Array(
    'Some',
    'Value',
    'Here'
);

// Results wanted:

Array(
    'Some',
    'Value*Here'
);

【问题讨论】:

  • 你能说得更具体点吗?字符串是什么,你想把它分成什么?
  • 只是不要在拆分正则表达式中使用*?或者您的意思是您想使用* 作为分隔符,但也允许在字符串内的各个值中使用它?
  • 是的,Marc B.我想用*分割,但也在值中使用它,不分割值。
  • 请添加示例文本。从您的示例中,我们无法区分分隔符和 * 值。

标签: php regex escaping character


【解决方案1】:

[] 被解释为字符类,因此它们中的任何字符都匹配。试试这个,但不要拆分它,使用 preg_match 并查看匹配的捕获组。

"/(\{([^:]*)\:([^:]*)\})+/"

原始答案(不适用于 OP 的问题):

如果你想在你的值中用\ 转义*,比如this\*value,你可以在这个正则表达式上拆分:

(?<!\\)\*

【讨论】:

  • 这不起作用.. 这是你的代码$str = '{test}:{asd}{asd}:{12*3}'; echo "&lt;pre&gt;"; preg_match("/(\{(.*)\}\:\{(.*)\})+/", $str, $matches); print_r($matches); echo "&lt;/pre&gt;"; 结果:Array ( [0] =&gt; {test}:{asd}{asd}:{12*3} [1] =&gt; {test}:{asd}{asd}:{12*3} [2] =&gt; test}:{asd}{asd [3] =&gt; 12*3 )
【解决方案2】:

您当前的正则表达式有点……狂野。字符类中的大多数特殊字符都是按字面处理的,因此可以大大简化:

$str = "{Some:Value*Here}";
$result = preg_split("/[{}:]+/", $str, -1, PREG_SPLIT_NO_EMPTY);

现在$result 看起来像这样:

array(2) {
  [0] => string(4) "Some"
  [1] => string(10) "Value*Here"
}

【讨论】:

    【解决方案3】:

    解决问题的正确和最安全的方法是使用preg_quote。如果字符串包含不应被引用的字符,您需要在引用后将其str_replace 回复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-05
      • 2013-12-28
      • 1970-01-01
      • 2011-11-17
      • 2013-02-25
      • 1970-01-01
      相关资源
      最近更新 更多