好吧,我被卡住了。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);
附言:啊啊!俄罗斯黑手党!;-)