代码之家  ›  专栏  ›  技术社区  ›  Faye D.

Regex在.,”之后对空格的使用进行“规范化”:字符(以及一些例外情况)

  •  2
  • Faye D.  · 技术社区  · 3 年前

    我需要规范一些文本(产品说明),以正确使用 . , , , : 象征

    我想到的正则表达式是:

    $variation['DESCRIPTION'] = preg_replace('#\s*([:,.])\s*(?!<br />)#', '$1 ', $variation['DESCRIPTION']);

    问题是,这与三种不应接触的情况相匹配:

    • 任何一千个分隔符,比如4500
    • 希腊语中的“固定”短语, ό,τι

    特别是对于数值异常,我知道它可以通过一些负的前向/后向来实现,但不幸的是,我不能在我当前的模式中组合它们。

    This

    任何帮助都将不胜感激!短暂性脑缺血发作

    1 回复  |  直到 3 年前
        1
  •  3
  •   Wiktor Stribiżew    3 年前

    您可以添加两个包含LookBehind的LookAhead:

    \s*([:,.])(?!(?<=ό,)τι)(?!(?<=\d.)\d)(?!\s*<br\s*/>)\s*
    

    regex demo \s* 到最后一个lookahead并将其与 \* 如果比赛失败了 <br/> : , , . .

    细节

    • -零个或多个空白
    • ([:,.]) -第一组:a : , .
    • (?!(?<=ό,)τι) -如果下两个字符不匹配,则匹配失败 τι 先于 ό,
    • (?!(?<=\d.)\d) -如果下一个字符是前面有数字和任意字符的数字,则匹配失败 . [:,.] 已经匹配了允许/需要的字符,在这里,我们只需要“跳过”匹配的字符)
    • (?!\s*<br\s*/>) -如果存在零个或多个空格,则会导致匹配失败的负前瞻, <br ,零个或多个空格, /> 立即位于当前位置的右侧。
    • \*