查找包含特殊字符的字符串的最后一个单词

时间:2015-12-04 13:20:04

标签: php regex

我正在尝试将span标记添加到字符串的最后一个单词中。如果字符串没有特殊字符,它就有效。我无法弄清楚正确的正则表达式。

$string = "Onun Mesajı";
echo preg_replace("~\W\w+\s*\S?$~", ' <span>' . '\\0' . '</span>', $string);

以下是土耳其语字符集:ÇŞĞÜÖİçşğüöı

3 个答案:

答案 0 :(得分:4)

您需要使用/u修饰符来允许处理模式和输入字符串中的Unicode字符。

preg_replace('~\w+\s*$~u', '<span>$0</span>', $string); 
                       ^

Full PHP demo

$string = "Onun Mesajı";
echo preg_replace("~\w+\s*$~u", '<span>$0</span>', $string);

此外,您需要的正则表达式只是\w+\s*$

  • \w+ - 一个或多个字母数字
  • \s* - 0个或更多空格(尾随)
  • $ - 字符串结尾

由于我从正则表达式中删除了\W,因此无需&#34;硬编码&#34;替换字符串中的前导空格(也被移除)。

答案 1 :(得分:1)

您应该使用正则表达式的u修饰符将引擎设置为unicode模式:

<?php
$subject = "Onun äöüß Mesajı";
$pattern = '/\w+\s*?$/u';
echo preg_replace($pattern, '<span>\\0</span>', $subject);

输出结果为:

Onun äöüß <span>Mesajı</span>

答案 2 :(得分:0)

这个正则表达式可以帮到你,并且比其他解决方案短得多:

[ ](.*?$)

以下是一个例子:

$string = "Onun Mes*ÇŞĞÜÖİçşğüöıajı";
echo preg_replace('~[ ](.*?$)~', ' <span>' .'${1}'. '</span>', $string);

将回应:

Onun <span>Mes*ÇŞĞÜÖİçşğüöıajı</span>

这个正则表达式的工作方式是我们在惰性模式[ ].*?中查找没有空格的任何字符。
然后我们添加$标识符,因此它匹配字符串的结尾。