我正在尝试使用PHP将用户的帖子(文本)转换为hashtag可点击链接。
根据我的发现,主题标签应该只包含字母数字字符。
$text = 'Testing#one #two #three.test';
$text = preg_replace('/#([0-9a-zA-Z]+)/i', '<a href="/hashtag/$1">#$1</a>', $text);
它将链接放在所有(#one #two #three)上,但我认为#one
不应转换,因为它与另一个字母数字字符相邻,如何将reg-ex调整为解决了吗?
第三个也没关系,它只匹配#three,我认为是正确的。
答案 0 :(得分:11)
你可以将你的正则表达式修改为非空格字符的负反面,如下所示:
(?<!\S)#([0-9a-zA-Z]+)
工作正则表达式示例:
PHP:
$text = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/', '<a href="/hashtag/$1">#$1</a>', $text);
修改强> 并使表达式与其他语言(非英语字符)兼容:
(?<!\S)#([0-9\p{L}]+)
工作示例:
答案 1 :(得分:0)
要捕获没有第一个标签的第二个和第三个标签,您需要指定标签应该从行的开头开始,或者在空格的一个或多个字符之前指定,如下所示:
$text = 'Testing#one #two #three.test';
$text = preg_replace('/(^|\s+)#([0-9a-zA-Z]+)(\b|$)/', '$1<a href="/hashtag/$2">#$2</a>', $text);
第三组中的\b
定义了一个单词边界,当它紧跟一个非单词字符时,它允许模式匹配#three。
编辑:MElliott上面的回答更有效率,记录。
答案 2 :(得分:0)
使用uni-code,html编码安全并加入regexp; ~(?<!&)#([\pL\d]+)~u
此处some's tags like #tag1 #tag2#tag3
等。