preg_replace 如果以 a-z 开头并以 a-z 结尾,则保留 space

preg_replace keep the space if start with a-z and end with a-z

我想用下划线替换 $string 中的任何 space

但如果 space 被 [a-z]

包围
$string = '@@ @@ English something else';

我试过了,但它会将“@@ @@”替换为“@_@”

$string = preg_replace('/[^a-z]\s[^a-z]/ui', '_' , $string);

我希望输出看起来像这样

@@_@@_English something else

我不确定那是什么语言,但我发现了这个:Use regular expression to match ANY Chinese character in utf-8 encoding

您的正则表达式需要包含(全部)汉字,可以表示为:

\p{Han}

这里是 PHP 关于 Unicode 字符的文档和支持的脚本列表:http://php.net/manual/en/regexp.reference.unicode.php

我认为您不需要为此任务包含 u unicode 标志。

简单地用 (*SKIP)(*FAIL) 取消不需要的 space 的资格,然后替换所有符合条件的 space。

代码:(Demo) (Pattern Demo)

$string = '英文 中文 English something else';
echo preg_replace('/[a-z] [a-z](*SKIP)(*FAIL)| /i','_',$string);

输出:

英文_中文_English something else

图案说明:

[a-z] [a-z](*SKIP)(*FAIL) <-- 这意味着匹配并丢弃字母-space-出现的字母
| <-- 这意味着 "OR"
</code> <-- 这将匹配字符串中每个未丢弃的 space (只有这些会被替换 </p> <hr> <p>两个带环顾四周的备选方案也可以工作(而且速度更快):(<a href="https://regex101.com/r/kg9Ycj/2" rel="nofollow noreferrer">Demo</a>)</p> <pre><code>/(?<![a-z]) | (?![a-z])/i


最快的是 \B(单词边界元字符的否定版本):(Demo)

/\B | \B/

抱歉,我不知道如何在评论中使用代码,所以请添加回复

测试了第二个和第三个模式也有效

第二个我明白了,但是第三个对我来说有点难哈哈

我需要去检查一下https://www.regular-expressions.info/

$string = '英文名 中文名 Peter Wong,John Tam,Sam Hu';
$string = preg_replace('/(?<![a-z]) | (?![a-z])/i', ',', $string);

输出是

英文名,中文名,Peter Wong,John Tam,Sam Hu

因为每个字符之间没有 CJK 名称 space,所以这解决了我的大问题

工作得很好 ;)

谢谢@mickmackusa