【问题标题】:PHP Regex: Matching "Space" if only within delimiterPHP Regex:仅在分隔符内匹配“空格”
【发布时间】:2017-09-25 02:48:23
【问题描述】:

我只需要匹配出现在分隔符 [] 中的“空格”,这样我就可以用 $ 更改空格。

这是正文:

[编辑]表达式和[文本以查看匹配项]。滚动[在火柴上或 ] 表达式以获取详细信息。使用 ctrl-z 撤消错误。 [节省 收藏和与朋友分享表达] 或社区。 使用工具探索您的结果。 [完整的参考和帮助是 可在库中找到或观看视频教程]。

这是我的正则表达式模式:

$pattern = preg_replace('/(?!\[[a-z]+)( )(?=[a-z]+\])/','$',$newString);

我使用regexr.com 来测试我的模式。该模式的输出如下所示:

我如何只匹配出现在分隔符 [] 中的“空格”谢谢。

【问题讨论】:

  • 是的,谢谢 :)
  • 您所采取的答案与关闭无关。假设你也不在乎?更好/更快的解决方案是匹配 \[(.+?)\] 然后使用回调替换 $1 中的空格。
  • @sln 我只需要匹配出现在分隔符 [] 中的空格,然后用 $ 符号替换空格。因此,如果有一个文本“[Text to see matches]”,它将被 [Text$to$see$matches] 替换。谢谢,假设...在其他情况下我也需要\[(.+?)\]

标签: php regex


【解决方案1】:

你可以使用

(?:\G(?!\A)|\[)[^]\s]*\K\s+

regex demo

详情

  • (?:\G(?!\A)|\[) - 上一次成功匹配的结束 (\G(?!\A)) 或 (|) [ 符号
  • [^]\s]* - 除了] 和空格之外的 0 个或多个字符
  • \K - 匹配重置运算符忽略当前迭代中到目前为止匹配的所有文本
  • \s+ - 1+ 个空格

PHP demo:

$str = '[Edit the] Expression & [Text to see matches]. Roll [over matches or the] expression for details. Undo mistakes with ctrl-z. [Save Favorites and Share expressions with friends] or the Community. Explore your results with Tools. [A full Reference and Help is available in the Library or watch the video Tutorial].';
$result = preg_replace('~(?:\G(?!\A)|\[)[^]\s]*\K\s+~', '$', $str);
echo $result;

另一种方法:匹配[...] 子字符串(使用\[[^][]+] 模式),并且只用preg_replace_callback 替换匹配中的空格:

$result = preg_replace_callback('~\[[^][]+]~', function ($m) {
    return preg_replace('~\s+~', '$', $m[0]);
}, $str);

another PHP demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多