$text = 'Hello @demo here!';
$pattern = '/@(.*?)[ ]/';
$replacement = '<strong>${1}</strong> ';
echo preg_replace($pattern, $replacement, $text);
这很有效,我得到这样的HTML:Hello <strong>demo</strong> here!
。但是当@demo
位于字符串的末尾时,这不起作用,例如:$text = 'Hello @demo';
。如何更改我的模式,因此只要字符串结束,它就会返回相同的输出。
问题2:
如果字符串与$text = 'Hello @demo!';
类似,那么它会不会将!
作为粗体文字?只需抓住space
,end of string
或not real-word
。
抱歉英语不好,希望你知道我需要什么。
答案 0 :(得分:2)
为了选择以@符号开头的单词,这个正则表达式将起作用:
$pattern = "/@(\w+)\b/"
`\ w`是`[a-zA-Z0-9_]`的简写字符类。 `\ b`是单词开头或结尾的锚点,在本例中是结尾。因此正则表达式是:选择以“@”开头,后跟一个或多个单词字符的内容,直到到达单词的结尾。
答案 1 :(得分:1)
您可以添加一个选项以匹配字符串的结尾:
@(.*?)(?= |\p{P}?$)
替换为<strong>$1</strong>
。
您还可以使用\p{P}
(任何Unicode标点符号)来防止粗体格式的标点符号。
这是demo。
答案 2 :(得分:1)
您可以使用字边界,这是他们的目的:
$pattern = '/@(.+?)\b/';
这也适用于问题2