0

我正在尝试将任何出现的 3 个字符或更少字符的单词转换为带有字符串 VVV 的同一个单词。
示例:for -> forVVV
我不使用拉丁字符 (UTF8),因此使用 MB。
我所拥有的是:

$pattern='\b[.{1,6}]\b';
$text=mb_ereg_replace($pattern,'\0VVV',$text,'me');

我错过了什么?

这是一个案例研究,看它什么都没有:

$text="א אב אבי אביהו מדינה שול של";
$pattern='/\b.{1,6}\b/um';
$text=preg_replace($pattern,'hhh',$text);
echo $text;
4

2 回答 2

0

您的模式没有正确检测或分组事物。

用于\w单词字符和标准括号而不是方括号,并且您不会在替换中评估 PHP 代码,您只是指捕获的文本段,因此不需要e标志:

$pattern = '\b(\w{1,3})\b';
$text = mb_ereg_replace($pattern, '\0VVV', $text, 'm');

或者,使用preg_replaceunicode 标志:

$text = preg_replace('/\b\w{1,3}\b/um', '\0VVV', $text)

如果您需要处理阿拉伯语和从右到左的字符,您需要使用 unicode 字符属性而不是\wand \b(\w不匹配来自所有语言的字母,并且\b只匹配\w\W\W\w- 两者都被破坏 wrt.non-latin语言。)

试试这个:

$text = preg_replace('/(?

(and again cos I can't tell whether I need to encode < or not)

$text = preg_replace('/(?<!\PL)(\pL{1,3})(?:\PL)/um', '\1VVV', $text);
于 2009-09-03T15:33:24.447 回答
0

这应该符合你想要的吗?

\b(?<Match>\w{1,3})\b
于 2009-09-03T17:49:52.717 回答