正则表达式匹配与替换

Regular Expression match vs replace

在Php我想开发多语言的hashtag系统,为此我会使用正则表达式机制,hash tag拆分并用超链接替换文本。

第一阶段哈希匹配将适用于给定的代码

$str = '#தமிழ் மாதங்களின் #வரலாறு';
preg_match_all('/#[^\s#]*/i', $str, $mat);

$mat 数组包含输入字符串中的所有哈希标签,如数组([0]-#தமிழ்,[1] -#வரலாறு )

第二阶段用超链接替换散列标签,正则表达式替换函数的结果为空,如下所示

$str = '#தமிழ்,#வரலாறு';
$expression = "/#[^\s#]*/i";        
$string = preg_replace($expression, '<a href="https://www.example.com/hash_tag?tag=">[=11=]</a>', $str);

我的预期结果是 #தமிழ் மாதங்களின் #வரலாறு

如何修复此正则表达式替换条件?

在模式 /#[^\s#]*/i 中,您不需要 /i,因为否定字符 class 匹配除 # 以外的任何字符或包含大写和小写字符。

在替换中,您使用 [=15=]</code>,它们是完全匹配和捕获组 1。但该模式目前没有捕获组。</p> <p>如果完整匹配应该包括 <code># 而第 1 组没有它,您可以将模式更改为 #([^\s#]+) 并重复字符 class 1+ 次以至少匹配#

之后的一个字符

您可以省略使用 preg_match_all 并仅使用 preg_replace:

echo preg_replace(
    '/#([^\s#]+)/',
    '<a href="https://www.example.com/hash_tag?tag=">[=10=]</a>',
    '#தமிழ் மாதங்களின் #வரலாறு'
);

输出

<a href="https://www.example.com/hash_tag?tag=தமிழ்">#தமிழ்</a> மாதங்களின் <a href="https://www.example.com/hash_tag?tag=வரலாறு">#வரலாறு</a>