关于 .
的正确用法,我需要规范一些文本(产品描述) , ,
, :
符号(前无空格,后有一个空格)
我想出的正则表达式是这样的:
$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/