好的,我被困住了。 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 буквы。
我明白为什么会这样但却未能找到正确的正则表达式。
答案 0 :(得分:1)
你不需要只匹配拉丁文+数字,但是前面有一个字,后面有一个字。
AFAIK,可变长度的后视是不可能的,因此您应该使用非捕获组(?:...)
和积极前瞻(?=...)
:
$regex = "/(?:[\p{Latin}\d]+ )([\p{Latin}\d ]+)(?= [\p{Latin}\d]+)/iu";
preg_replace($regex, '<b>$1</b>', $text);
PS:Aaaah!俄罗斯黑手党! ; - )