2009-09-03 82 views
0

我试图将带有3个字符或更少的单词的任何出现转换为与字符串VVV相同的单词。
例如:for - > forVVV
我没有使用拉丁字符(UTF8),因此是MB。
我拥有的是:REGEXP将任何3个字符或更少的单词转换为wordVVV

$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; 

回答

0

你的图案不是检测或分组的事情吧。

使用\w一个字的字符和标准括号而不是方括号,而你没有评估在更换PHP代码,你只是指捕获文本段,所以不需要e标志:

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

或者,使用preg_replace与统一的标志:

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

如果需要,以满足阿拉伯和从右到左的字符,你需要给我们Unicode字符properti es而不是\w\b\w与所有语言的字母不匹配,而\b只在\w\W\W\w之间匹配 - 这两个字符都被打断了。非拉丁语系)

试试这个这一翻译:

$text = preg_replace('/(?

(又一次因为我不能告诉我是否需要编码<与否)

$text = preg_replace('/(?<!\PL)(\pL{1,3})(?:\PL)/um', '\1VVV', $text);
+0

Nop,有些东西仍然是错误的,请检查问题,我添加了一个显示问题的实际代码片段。 – 2009-09-03 17:38:35

+0

我已经编辑了ansewr以包含使用'\ pL'和'\ PL'的示例,其中使用负向预读和后退断言替代仅拉丁语的\ b'字边界检测。 – searlea 2009-09-03 19:33:57

0

这应该与什么你要?

\b(?<Match>\w{1,3})\b