【发布时间】:2010-09-20 09:36:03
【问题描述】:
假设你有一个字符串,但你不知道它包含什么。并且您想用同一单词的格式化版本替换特定单词的所有出现或单词的一部分。 例如,我有一个包含“lorem ipsum”的字符串,我想用“lorem can”替换包含“lo”的整个单词,以便最终结果是“lorem can ipsum” 但是如果我将字符串“loreal ipsum”放入同一个函数中,结果现在将是“loreal can ipsum”。 谢谢
【问题讨论】:
假设你有一个字符串,但你不知道它包含什么。并且您想用同一单词的格式化版本替换特定单词的所有出现或单词的一部分。 例如,我有一个包含“lorem ipsum”的字符串,我想用“lorem can”替换包含“lo”的整个单词,以便最终结果是“lorem can ipsum” 但是如果我将字符串“loreal ipsum”放入同一个函数中,结果现在将是“loreal can ipsum”。 谢谢
【问题讨论】:
$str = preg_replace('/(\blo[a-z]+\b)/', '$1 can', $str);
RoBorg 回答的问题是:
\w 匹配数字和下划线,它们在人类语言中不是真正字字符,因此它会匹配“lo_fi”或“__lo__”。lo 开头的单词,例如“slorem”,甚至可以匹配以lo 结尾的单词,例如“allo”。\b 确保 lo 跟在一个分词符(零宽度)之后,[a-z]+ 确保至少一个字母字符跟在 'lo' 之后。
编辑:我看到问题的文字是“包含”而不是“开始于”,在这种情况下,第一个 \b 可能会被省略。
编辑 2:请注意,这些解决方案都不是国际安全的。我还没有对此进行测试,但 PHP 的 RegEx 非常有能力,所以我猜它会起作用:
$str = preg_replace('/(\blo[a-z\p{L}]+\b)/', '$1 can', $str);
【讨论】:
$str = preg_replace('/lo(\w*)/', 'lo$1 can', $str);
这会将“lo”加上任何单词字符替换为“lo”+其他字符+“can”
它还会将“lo”替换为“lo can” - 如果您不想要这个,请将 \w* 更改为 \w+
【讨论】: