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


Matching alphanumeric characters separated by spaces

好吧,我被卡住了。PHP,Regex。我有一个字符串:

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

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

这是拉丁字母。

我最好的机会是:

$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":

这是拉丁字母。

我理解为什么会这样,但没能找出正确的Regex。

您不仅需要匹配拉丁文+数字单词,还需要查找前面一个单词和后面一个单词。AFAIK,可变长度向后看是不可能的,所以你应该使用非捕获组(?:...)和正向向前看(?=...):

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

附言:啊啊!俄罗斯黑手党!;-)