php - 正则表达式到 "normalize"使用 SPACE 之后。 , : chars (and some exceptions)

标签 php regex regex-negation

关于 . 的正确用法,我需要规范一些文本(产品描述) , , , :符号(前无空格,后有一个空格)

我想出的正则表达式是这样的:

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

问题在于这匹配了它不应该涉及的四种情况:

  • 任何十进制数,例如 5.5
  • 任何千位分隔符,例如 4,500
  • 希腊语中的“固定”短语,ό,τι
  • 省略号,... - 基本上省略号是一个完全特殊的情况,我认为应该在单独的 preg_replace 中处理它也许?我的意思是,三个点应该被视为一件事,这意味着 some text ...确实应该匹配并转换为 some text...但不是 some text. . .

特别是对于数字异常,我知道可以通过一些负面的前瞻/后瞻来实现,但不幸的是我无法将它们组合到我当前的模式中。

This是你检查的 fiddle (不应该匹配的情况在第 2、3、4 行)。

编辑:下面发布的两个解决方案都可以正常工作,但最终会在描述的最后一个句号之后添加一个空格。这不是什么大问题,因为在我的代码前面,我正在处理 <br /> s 和 空格 在描述的开头和结尾,所以我把这个 preg_replace 移到那个之前...

所以,我最终使用的最终代码是这样的:

$variation['DESCRIPTION'] = preg_replace('#\s*([:,.])(?!(?<=\d.)\d)(?!(?<=ό,)τι)\s*#ui', '$1 ', $variation['DESCRIPTION']);
$variation['DESCRIPTION'] = preg_replace('#^\s*(<br />)*\s*|\s*(<br />)*\s*$#', '', $variation['DESCRIPTION']);

所以剩下要做的唯一一件事就是改变这段代码,让它按照我上面描述的方式处理省略号。

非常感谢您对最后一个要求的任何帮助! TIA

最佳答案

你可以添加两个包含lookbehinds的lookaheads:

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

regex demo .请注意,我还添加了 \s*到最后的前瞻并将其与消耗的 \s* 交换如果有 <br/> 则匹配失败在 : 之后的任何零个或多个空格之后, ,. .

详情

  • \s* - 零个或多个空格
  • (\.{2,}|[:,.]) - 第 1 组:两个或多个点,或 : , ,.
  • (?!(?<=ό,)τι) - 如果接下来的两个字符是 τι,则匹配失败以 ό, 开头
  • (?!(?<=\d.)\d) - 如果下一个字符是一个数字前面有一个数字和任何字符,则匹配失败(注意 . 就足够了,因为 [:,.] 已经匹配允许/需要的字符,在这里,我们只需要“跳过”匹配的字符)
  • (?!\s*<br\s*/>) - 如果有零个或多个空格,则匹配失败的负前瞻,<br , 零个或多个空格, />就在当前位置的右侧。
  • \s* - 零个或多个空格。

关于php - 正则表达式到 "normalize"使用 SPACE 之后。 , : chars (and some exceptions),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69958749/

相关文章:

regex - 正则表达式不包括特定的可选后缀

正则表达式模式仅在一行中捕获数字,但不包括日期模式

javascript - 如何将 href 回显到可编辑 div

php - MySQL where NOT IN 名称数组?

java - 根据定界符拆分字符串

javascript - 为什么名称验证无效?

javascript - 正则表达式电话号码验证

.net - 有没有办法对这些信息进行正则表达式。

php - Laravel Controller 中一种特定方法的中间件

c# - 将 PHP 函数转换为 C#