2012-04-02 55 views
1

好吧,我卡住了。 PHP,正则表达式。我有一个字符串:匹配由空格分隔的字母数字字符

Это кириллические 23 78these are56 45latin76 letters here98 85 буквы.

而且我想使用的preg_replace()发布包含拉丁文字母,数字和空格子与<b>标签。子串不只是一个字,但只要下一个单词包含拉丁字符集的话:

Этокириллические23个78these are56 45latin76字母here98 85буквы。

我最好的拍摄是:

$text = 'Это кириллические 23 78these are56 45latin76 letters here98 85 буквы.'; 
$regex = "/\d*\p{Latin}+(\d|\s|\p{Latin})*/iu"; 
preg_replace($regex, '<b>$0</b>', $text); 

但它抓住不仅是 “here98”,而且下面的 “85”:

Этокириллические23个78these are56 45latin76字母here98 85буквы。

我明白为什么它是如此,但未能弄清楚正确的正则表达式。

+0

你试过[A-z0-9]吗? – hjpotter92 2012-04-02 21:22:56

+0

@TheJumpingFrog,[A-z0-9]不考虑空格。我需要像bla34 64bla而不是bla3464bla。 – 2012-04-02 21:30:50

+0

'([A-z0-9] | \ s)'会占用空白吗? – hjpotter92 2012-04-02 21:32:08

回答

1

您不仅需要匹配拉丁+数字的单词,还要看前面的一个单词和后面的单词。 据我所知,可变长度看,屁股是不可能的,所以你应该使用非捕获组(?:...)和积极的前瞻(?=...)

$regex = "/(?:[\p{Latin}\d]+)([\p{Latin}\d ]+)(?= [\p{Latin}\d]+)/iu"; 
preg_replace($regex, '<b>$1</b>', $text); 

PS:AAAAH!俄罗斯黑手党! ;-)

+0

哦,yesss。它工作,我的宝座。难怪在时间到了的时候我无法正确使用它们。实际上,我正在为片假名/平假名/汉字完成这项任务,西里尔字母和拉丁字母在示例中更容易使用。 Arigatou gozaimasu到俄罗斯黑手党。 :-) – 2012-04-02 21:52:22

+0

@AriLinnどういたしまして – kirilloid 2012-04-02 21:58:08

相关问题