匹配用空格分隔的字母数字字符

时间:2012-04-02 21:19:22

标签: php regex

好的,我被困住了。 PHP,正则表达式。我有一个字符串:

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

我想使用preg_replace()来包含一个包含拉丁字母,数字和空格的子字符串,其中< b>标签。只要下一个单词包含拉丁字符,子字符串不仅仅是一个单词而是一组单词:

Этокириллические23 78these are56 45latin76字母在这里98 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字母在这里98 85 буквы。

我明白为什么会这样但却未能找到正确的正则表达式。

1 个答案:

答案 0 :(得分:1)

你不需要只匹配拉丁文+数字,但是前面有一个字,后面有一个字。 AFAIK,可变长度的后视是不可能的,因此您应该使用非捕获组(?:...)和积极前瞻(?=...)

$regex = "/(?:[\p{Latin}\d]+ )([\p{Latin}\d ]+)(?= [\p{Latin}\d]+)/iu";
preg_replace($regex, '<b>$1</b>', $text);
PS:Aaaah!俄罗斯黑手党! ; - )